404s inconsistentes temporários em toda instalação | Erro de PHP com post-template.php

9

Estou profundamente confuso com este: Eu tenho uma instalação do WordPress em um Media Temple GS [um dos muitos que funcionam bem e são configurados quase exatamente o mesmo], o que ocasionalmente está me dando 404s em todo o site. Quando isso acontece eu recebo 3 erros juntos no meu log de erro do PHP:

[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

Os dois primeiros referem-se ao $post object & o terceiro para isso: get_post()->ID; que eu acho que é a criação do objeto $post .

Eu tenho dois desses trios idênticos de mensagens de erro quase com exatamente 25 minutos de intervalo [off por 2s].

Eu tentei suporte de MT, mas eles acham que deve ser um erro de WP. Estou executando a versão mais recente do WP, mas enfrentei esse problema com versões anteriores.

Eu tinha dois plug-ins ativados: W3 Total Cache & Reconstrução de Miniaturas AJAX

Eu testei com e sem o plugin de cache e o problema persiste. Acabei de desativar o plugue de miniaturas para ver se faz alguma diferença.

Por favor, ajude isso está me deixando louco! [e eu quis lançar publicamente este site hoje]

EDITAR

Eu também deveria ter mencionado que eu vi esse erro em alguns, mas não em todos os outros wordpress instalados neste servidor. Eu acho, mas não pode ser 100% de certeza, que aqueles que apresentam erros são instalações mais recentes do que as que funcionam bem. Embora todas as instalações sejam totalmente atualizadas.

EDIT2

Estou apenas trabalhando em outro projeto WP e percebi pelo menos o que esses 3 erros significam. Eu posso reproduzir exatamente esses três erros de php, indo para a página de índice de um tipo de post personalizado que não existe. No entanto, isso não explica por que isso causaria o erro 404 nesta questão, especialmente porque ele não acontece apenas em páginas de índice de tipo de postagem personalizada. No entanto, acho que isso deve estar relacionado aos tipos de postagem personalizados de alguma forma.

    
por iiz 01.11.2013 / 23:35

1 resposta

0

Você não tem informações suficientes para resolver seu problema. Tente adicionar rastreamento de pilha completo e solicitar informações ao seu log de erro para investigar um problema.

Você pode criar seu próprio manipulador de erros personalizado para adicionar rastreamento de pilha e solicitar informações para o seu log de erros.

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;
}

Você pode verificar se isso está funcionando, adicionando trigger_error em algum lugar em seu código, por exemplo, em single.php file.

trigger_error('Annoying notice');

Seu log de erros deve mostrar algo assim:

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"

Com esse tipo de mensagem, será muito mais fácil descobrir onde está o problema.

    
por kierzniak 02.07.2018 / 16:34