wp_head is too slow

时间:2014-10-13 作者:Apul Gupta

我正在为其中一个网站使用wordpress 3.9.1。我的反应很慢,大约35秒。我做了调查;发现wp_head 花费了太多时间。此外,我调试;发现wp中的函数包含/插件。php导致了:

function do_action($tag, $arg = \'\') {
    global $wp_filter, $wp_actions, $merged_filters, $wp_current_filter;

    if ( ! isset($wp_actions[$tag]) )
        $wp_actions[$tag] = 1;
    else
        ++$wp_actions[$tag];

    // Do \'all\' actions first
    if ( isset($wp_filter[\'all\']) ) {
        $wp_current_filter[] = $tag;
        $all_args = func_get_args();
        _wp_call_all_hook($all_args);
    }

    if ( !isset($wp_filter[$tag]) ) {
        if ( isset($wp_filter[\'all\']) )
            array_pop($wp_current_filter);
        return;
    }

    if ( !isset($wp_filter[\'all\']) )
        $wp_current_filter[] = $tag;

    $args = array();
    if ( is_array($arg) && 1 == count($arg) && isset($arg[0]) && is_object($arg[0]) ) // array(&$this)
        $args[] =& $arg[0];
    else
        $args[] = $arg;
    for ( $a = 2; $a < func_num_args(); $a++ )
        $args[] = func_get_arg($a);

    // Sort
    if ( !isset( $merged_filters[ $tag ] ) ) {
        ksort($wp_filter[$tag]);
        $merged_filters[ $tag ] = true;
    }

    reset( $wp_filter[ $tag ] );
   ///////////////////// PROBLEM STARTS FROM HERE //////////////////
    do {
        foreach ( (array) current($wp_filter[$tag]) as $the_ )
            if ( !is_null($the_[\'function\']) )
            {
                call_user_func_array($the_[\'function\'], array_slice($args, 0, (int) $the_[\'accepted_args\']));
            }
    } while ( next($wp_filter[$tag]) !== false );
////////////////////////// PROBLEM AREA ENDS HERE ///////////////////

    array_pop($wp_current_filter);
}
do中存在问题。。而执行循环大约需要30秒。请建议我如何摆脱这种缓慢的反应。

2 个回复
最合适的回答,由SO网友:Radley Sustaire 整理而成

do_action() 在插件中。php是有原因的。它是供插件使用的,就像apply_filters(). 这个功能不是原因,它只是中间人。这就像说你的披萨味道不好是因为送货员,而不是餐厅本身。

这几乎可以肯定是由插件引起的。

我建议使用插件P3(插件性能分析器)来分析插件的性能。有些插件特别臃肿(Jetpack、SEO Ultimate),但可以通过禁用不需要的模块进行优化。

https://wordpress.org/plugins/p3-profiler/

如果GoDaddy品牌不适合你,可能会有其他插件,我自己也不喜欢GoDaddy,但这个插件很棒。

SO网友:Otto

这个do_action 函数是负责执行挂钩操作的函数。

WordPress基于“动作”系统工作。从本质上讲,动作是代码生成过程中的一个命名点,其他代码可以在该特定时间点连接或“挂钩”到并运行其代码。

现在,WordPress中有数千个这样的操作,但您所指的具体操作是wp_head 呼叫这是由wp_head() 作用其目的是让代码将内容放入HTML页面生成的标题代码中。Javascript和样式表链接等内容在wp\\u head调用中获得输出。

您已经将其缩小到了wp\\u head中调用连接到wp\\u head中的函数的部分,所以实际上,您根本没有缩小范围。任何连接到wp\\U头的东西都可能是问题所在。

因此,考虑到您已经将其缩小到主题中的一个问题,并且考虑到主题不是免费的,因此我们无法看到它们的代码,那么我要说的是查看主题的代码,并查找以下特定类型的内容:

任何挂在wp\\U头上的东西。明显的这将是任何add_action(\'wp_head\', ... );. 第二个参数是在wp\\u head操作中调用的函数的名称。

任何看起来很慢的东西都可能特别慢。例如,如果某个函数正在调用web,以通过http请求获取某些内容,这可能就是原因。

任何名称包含“脚本”或“样式”的内容。这些总是输出到头部,因此可能会涉及。

现在,您还可以使用几个插件来帮助您调试站点。

Debug Bar 是一个基础插件,您需要使用下一个插件。它在页面上的管理栏中添加了一个“调试”栏,显示了站点运行和创建页面时发生的详细情况。要使用它,您需要安装、激活它,并在WP配置中打开WP\\U调试设置。php文件。

Debug Bar Slow Actions 将“慢速操作”列表添加到调试栏输出中,告诉您每个操作运行所需的时间,以及连接到它的函数和由它运行的函数。这将使您缩小使其变慢的确切原因,并将其跟踪到负责的函数。

结束