如何在class-wp-query.php中跟踪核心函数is_page()&is_Single上的通知警告

时间:2017-12-11 作者:Max

在我的生产站点上,我的这些产品已经超支了:

PHP Notice:  Trying to get property of non-object in /public_html/wp-includes/class-wp-query.php on line 3728
PHP Notice:  Trying to get property of non-object in /public_html/wp-includes/class-wp-query.php on line 3730
PHP Notice:  Trying to get property of non-object in /public_html/wp-includes/class-wp-query.php on line 3732
PHP Notice:  Trying to get property of non-object in /public_html/wp-includes/class-wp-query.php on line 3863
上述行位于is_page()is_singular() 功能。

我不知道这些函数在哪里被错误使用。令人沮丧的是,我无法在我的临时站点(与生产服务器相同的服务器)或本地主机上复制这些内容。我不能轻易地停用所有插件或切换主题,因为我们在任何给定时间都有数百个登录用户和数千个未登录用户。

我已在我的存储库中搜索is_page()is_singular() 并试图验证它们是否被正确调用。显然我失败了。

我怎样才能知道是什么让这些PHP通知绊倒了?

为了记录在案,在我提交问题之前,我浏览了弹出的“类似问题”!

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

您可以创建自己的自定义错误处理程序,并将堆栈跟踪添加到错误日志中。

set_error_handler(\'wpse_288408_handle_error\');

function wpse_288408_handle_error( $errno, $errstr, $errfile, $errline ) {

    if( $errno === E_USER_NOTICE ) {

        $message = \'You have an error notice: "%s" in file "%s" at line: "%s".\' ;
        $message = sprintf($message, $errstr, $errfile, $errline);

        error_log($message);
        error_log(wpse_288408_generate_stack_trace());
    }
}
// Function from php.net http://php.net/manual/en/function.debug-backtrace.php#112238
function wpse_288408_generate_stack_trace() {

    $e = new \\Exception();

    $trace = explode( "\\n" , $e->getTraceAsString() );

    // reverse array to make steps line up chronologically

    $trace = array_reverse($trace);

    array_shift($trace); // remove {main}
    array_pop($trace); // remove call to this method

    $length = count($trace);
    $result = array();

    for ($i = 0; $i < $length; $i++) {
        $result[] = ($i + 1)  . \')\' . substr($trace[$i], strpos($trace[$i], \' \')); // replace \'#someNum\' with \'$i)\', set the right ordering
    }

    $result = implode("\\n", $result);
    $result = "\\n" . $result . "\\n";

    return $result;
}
您可以通过添加trigger_error 代码中的某个地方。

trigger_error(\'Annoying notice\');
错误日志应输出如下内容:

2017/01/02 12:00:00 [error] 999#999: *999 FastCGI sent in stderr: "PHP message: You have an error notice: "Annoying notice" in file "/var/www/test/wp-content/plugins/test/test.php" at line: "99".
PHP message:
1) /var/www/test/index.php(17): require(\'/var/www/test/w...\')
2) /var/www/test/wp-blog-header.php(13): require_once(\'/var/www/test/w...\')
3) /var/www/test/wp-load.php(37): require_once(\'/var/www/test/w...\')
4) /var/www/test/wp-config.php(93): require_once(\'/var/www/test/w...\')
5) /var/www/test/wp-settings.php(305): include_once(\'/var/www/test/w...\')
6) /var/www/test/wp-content/plugins/test/test.php(99): trigger_error(\'Annoying notice\')
7) [internal function]: wpse_288408_handle_error(1024, \'Annoying notice\', \'/var/www/test/w...\', 99, Array)" while reading response header from upstream, client: 192.168.33.1, server: test.dev, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9070", host: "test.dev"
有了这种信息,就更容易找出问题所在。

SO网友:scytale

Stage和Prod可能位于同一台服务器上,但它们是否为同一版本的PHP配置?

Wordpress调试插件可能会为您提供其他信息。查询监视器https://en-gb.wordpress.org/plugins/query-monitor/#description 为PHP通知和错误提供调用堆栈。激活后:作为管理员用户,转到有问题的页面。不明显,但顶部的功能区应该显示秒和KB,将鼠标悬停在上面,然后单击“错误”(我想)。在我的网站上(仅通知-无错误):

Query Monitor ribbon

单击“错误”后,将显示详细信息,包括可能有帮助的调用堆栈。

如果PHP 7是一个问题,那么WP插件目录中的某个地方有一个兼容性检查器,这可能会很有用。它确实会给出误报,例如,插件可能会被标记为不兼容,即使它在检查服务器未使用PHP 7后只使用了一个已取消配置的函数。

结束

相关推荐

使用AJAX和PHP检查新消息。服务器超载?

我写了一个脚本(可能不太完美,我是新手)每X分钟检查一次新消息(使用ArrowChat和Buddypress)。它工作得很好,但我担心它会使我的服务器过载吗?它是共享的。代码:PHP// Prepare database global $wpdb; $wpdb->prepare; // Check are there new messages $query = $wpdb->get_results( \'SELECT `id` FROM `arrowc