整个安装的临时404不一致|后template.php出现PHP错误

时间:2013-11-01 作者:iiz

我对这一点深感困惑:我在Media Temple GS上安装了WordPress[其中一个运行良好,配置几乎完全相同],偶尔会在整个网站上安装404s。发生这种情况时,我的PHP错误日志中会出现3个错误:

[01-Nov-2013 22:20:50 UTC] PHP Notice:  Trying to get property of non-object in /nfs/---/---/mnt/---/domains/---.---/html/wp-includes/post-template.php on line 275
[01-Nov-2013 22:20:50 UTC] PHP Notice:  Trying to get property of non-object in /nfs/---/---/mnt/---/domains/---.---/html/wp-includes/post-template.php on line 209
[01-Nov-2013 22:20:50 UTC] PHP Notice:  Trying to get property of non-object in /nfs/---/---/mnt/---/domains/---.---/html/wp-includes/post-template.php on line 29
前两个与$post 对象(&A);第三条:get_post()->ID; 我认为这是$post 对象

我有两个相同的三个错误消息,几乎正好相隔25分钟[相差2秒]。

我尝试了MT支持,但他们认为这一定是WP错误。我正在运行最新版本的WP,但在早期版本中遇到过此问题。

我启用了2个插件:W3 Total Cache&;AJAX缩略图重建

我已经测试了有无缓存插件,问题依然存在。我刚刚禁用了缩略图插件,看看它是否有什么不同。

请帮帮我,这让我发疯了![我今天想公开发布这个网站]

EDIT

我还应该提到,我在这台服务器上的其他wordpress安装中看到了这个错误,但不是所有。我认为,但不能百分之百肯定,那些显示错误的是比那些工作正常的更新的安装。尽管所有安装都已完全更新。

EDIT2

我正在做另一个WP项目,至少意识到了这三个错误的含义。通过转到不存在的自定义帖子类型的索引页,我可以准确地再现这三个php错误。然而,这并不能解释为什么会出现这个问题中的404,特别是因为它不仅仅发生在自定义帖子类型的索引页面上。然而,我认为这在某种程度上一定与自定义帖子类型有关。

2 个回复
SO网友:Jesse Nickles

404错误有两种类型:WordPress生成的错误和server生成的错误。

在某些服务器环境中,在CPU过载或某些配置错误的情况下,服务器可能会错误地显示404。通常,服务器生成的404错误会在页面底部显示“Nginx”或“Apache”之类的内容(取决于服务器类型)。

在其他情况下,WordPress(PHP)可能会生成“误报”404错误,因为安全插件阻止了对加载资源的访问:

Why am I sometimes getting a 404 error when I try to update a page with Elementor?

https://wordpress.org/support/topic/getting-false-positive-404-errors-with-newest-update/

尝试禁用任何安全插件、清除缓存并刷新页面。服务器上安装的ModSecurity等安全模块也可能是原因之一。

这也可能是由于主题或插件编码不当造成的。检查是否有一个共同的主题或插件安装在所有相关的网站上。如果这个问题只发生在Media Temple托管上,可能是他们配置错误,甚至是您的服务器负载过大。。。

SO网友:kierzniak

您没有足够的信息来解决您的问题。尝试将完整堆栈跟踪和请求信息添加到错误日志中,以调查问题。

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

set_error_handler(\'wpse_120959_handle_error\');

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

    if( $errno === E_USER_NOTICE ) {

        $error = PHP_EOL . PHP_EOL;

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

        $error .= \'Request information:\' . PHP_EOL;
        $error .= wpse_120959_generate_http_request_info();

        error_log( $error );
    }
}

// Function from php.net http://php.net/manual/en/function.debug-backtrace.php#112238
function wpse_120959_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;
}

function wpse_120959_generate_http_request_info() {

    $request_info = \'\';
    $request_info_format = "%s %s %s\\nHTTP headers:\\n";

    $headers = wpse_120959_get_headers();
    $header_format = "%s: %s \\n";

    $request_method  = filter_input( INPUT_SERVER, \'REQUEST_METHOD\', FILTER_SANITIZE_STRING );
    $request_uri     = filter_input( INPUT_SERVER, \'REQUEST_URI\', FILTER_SANITIZE_STRING );
    $server_protocol = filter_input( INPUT_SERVER, \'SERVER_PROTOCOL\', FILTER_SANITIZE_STRING );

    $request_info = sprintf( $request_info_format, $request_method, $request_uri, $server_protocol );

    foreach ( $headers as $name => $value ) {
        $request_info .= sprintf( $header_format, $name, $value );
    }

    return $request_info;
}

function wpse_120959_get_headers() {

    $headers = [];

    foreach ($_SERVER as $name => $value) {

        if (preg_match(\'/^HTTP_/\', $name ) ) {

            $value = filter_input( INPUT_SERVER, $name, FILTER_SANITIZE_STRING );

            $name = strtr( substr( $name, 5 ), \'_\', \' \');
            $name = ucwords( strtolower( $name ) );
            $name = strtr( $name, \' \', \'-\' );

            // add to list
            $headers[$name] = $value;
        }
    }

    return $headers;
}
您可以通过在代码中的某处添加trigger\\u error来检查这是否有效,例如single.php 文件

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

2018/07/02 14:26:00 [error] 714#714: *58 FastCGI sent in stderr: "PHP message:

You have an error notice: "Annoying notice" in file "/var/www/test/content/themes/twentyseventeen/single.php" at line: "19".
1) /var/www/test/index.php(17): require(\'/var/www/test/w...\')
2) /var/www/test/wordpress/wp-blog-header.php(19): require_once(\'/var/www/test/w...\')
3) /var/www/test/wordpress/wp-includes/template-loader.php(74): include(\'/var/www/test/c...\')
4) /var/www/test/content/themes/twentyseventeen/single.php(19): trigger_error(\'Annoying notice\')
5) [internal function]: wpse_120959_handle_error(1024, \'Annoying notice\', \'/var/www/test/c...\', 19, Array)

Request information:
GET /hello-world/ HTTP/1.1
HTTP headers:
Accept-Language: en-US;q=0.8,en;q=0.7
Accept-Encoding: gzip, deflate
Referer: http://test.local/
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
User-Agent: Mozilla/5.0 AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1
Upgrade-In" while reading upstream, client: 192.168.10.1, server: test.local, request: "GET /hello-world/ HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.2-fpm.sock:", host: "test.local", referrer: "http://test.local"
有了这种信息,就更容易找出问题所在。

结束