为什么我的并发AJAX请求到PHP脚本/ WP REST API这么慢?

前端之家收集整理的这篇文章主要介绍了为什么我的并发AJAX请求到PHP脚本/ WP REST API这么慢?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
经过一番调查,我更新了问题的标题.请看下面我的更新.

原来的问题:

我正在使用wordpress建立一个网站,有时使用异步调用WP REST API端点.

从我的AJAX函数调用这个端点通常至少从〜780ms的TTFB时间:

但是如果我直接在浏览器中打开URL /端点,那么TTFB的时间要快4-5倍,

我不知道延迟来自哪里.我使用Apache 2.4,启用了HTTP / 2和PHP 7,在本地的开发者服务器上运行此页面.

什么是监控这种表现的最佳方式“问题”?

请注意:我没有使用wordpress内置的AJAX功能.我只是打个电话

axios.get(`${url}/wp-json/wp/v2/flightplan`)

在我的主页模板中安装的React组件中.

更新

很有趣:清除饼干减少TTFB很多:

更新2

删除其他两个AJAX呼叫之后,飞行计划请求的执行速度要快得多.我认为并发AJAX请求有一些问题.我已经阅读了一些关于会话锁定的内容,但是由于wordpress和所有安装的插件没有使用会话,所以不可能.

更新3

最重要的是,它与我的本地服务器设置有关.只需将站点部署到“真实”网络服务器:

但是,知道如何设置可以更好地并发处理的服务器仍然是有趣的.

更新4

我做了一个测试:在调用“真实”之前调用4个虚拟请求.脚本只返回一个“Foobar”字符串.这一切都看起来不错:

但是当将sleep(3)添加到虚拟AJAX脚本中时,所有其他请求也需要更长的时间:

为什么?

每次由wordpress提供AJAX请求时,都会加载所有wordpress核心,活动主题和所有活动插件.我们可以通过使用必须使用的插件来排除特定的插件来加载特定的请求来减少这个开销.

因此,优化对AJAX请求不必要的插件负载.你必须忽略一些插件.您可以使用MU(must-use) codex来加载整个网站需要的插件.

MU插件与常规wordpress插件非常不同.它们安装在与常规插件分开的特殊/ wp-content / mu-plugins /文件夹中.只要它们位于该文件夹中,它们是活动的.要停用它们,您需要从该文件夹中删除它们.在加载常规插件之前,还会执行MU插件.

这就是为什么我们在这里使用一个MU插件.我们可以提前加载常规插件,并控制加载哪些插件.

在这种情况下,我们的MU插件由单一功能组成:

function wpmdbc_exclude_plugins( $plugins ) {
    if ( !defined( 'DOING_AJAX' ) || !DOING_AJAX || !isset( $_POST['action'] ) || false === strpos( $_POST['action'],'wpmdb' ) ) return $plugins;
    $wpmdb_settings = get_option( 'wpmdb_settings' );
    if ( !empty( $wpmdb_settings['blacklist_plugins'] ) ) {
        $blacklist_plugins = array_flip( $wpmdb_settings['blacklist_plugins'] );
    }
    foreach( $plugins as $key => $plugin ) {
        if ( false !== strpos( $plugin,'wp-migrate-db-pro' ) || !isset( $blacklist_plugins[$plugin] ) ) continue;
        unset( $plugins[$key] );
    }
    return $plugins;
}
add_filter( 'option_active_plugins','wpmdbc_exclude_plugins' );

你可以看到我们正在进入一个过滤器.所以当get_option(‘active_plugins’);被调用,该函数将被执行,并且可以修改哪些插件是活动的.

第一个条件语句确保我们正在处理WP Migrate DB Pro AJAX请求,如果不是我们保释,让wordpress像往常一样提供请求,加载所有活动插件.

函数的第二部分循环遍历活动插件列表,并检查几个条件.检查插件是否在我们的黑名单插件中排除.如果是,我们只需将其从活动插件列表中删除,防止在wordpress加载活动插件时加载它.

猜你在找的Ajax相关文章