404 temporales inconsistentes en toda la instalación | Error de PHP con post-template.php

9

Estoy profundamente confundido con esto: tengo una instalación de WordPress en un Media Temple GS [uno de los muchos que funcionan bien y están configurados casi exactamente igual] que ocasionalmente me da 404s en todo el sitio. Cuando esto sucede, obtengo 3 errores juntos en mi registro de errores de 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

Los dos primeros se relacionan con el $postobjeto y el tercero con esto: get_post()->ID;lo que creo que es la creación del $postobjeto.

Tengo dos de estos tríos idénticos de mensajes de error con casi exactamente 25 minutos de diferencia [apagado por 2 segundos].

He probado el soporte de MT pero creen que debe ser un error de WP. Estoy ejecutando la última versión de WP pero he experimentado este problema con versiones anteriores.

Tenía 2 complementos habilitados: W3 Total Cache y AJAX Thumbnail Rebuild

He probado con y sin el complemento de caché y el problema persiste. Acabo de deshabilitar el conector de miniatura para ver si hace alguna diferencia.

¡Por favor ayuda, esto me está volviendo loco! [y quería lanzar públicamente este sitio hoy]

EDITAR

También debería haber mencionado que he visto este error en algunas, pero no en todas las otras instalaciones de WordPress en este servidor. Creo, pero no puedo estar 100% seguro, que aquellos que muestran errores son instalaciones más nuevas que las que funcionan bien. Aunque todas las instalaciones están completamente actualizadas.

EDIT2

Solo estoy trabajando en otro proyecto de WP y me di cuenta al menos de lo que significan esos 3 errores. Puedo reproducir exactamente esos tres errores de php yendo a la página de índice de un tipo de publicación personalizada que no existe. Sin embargo, esto no explica por qué eso causaría el 404 en esta pregunta, especialmente porque no solo sucede en páginas de índice de tipo de publicación personalizada. Sin embargo, creo que esto debe estar relacionado con los tipos de publicaciones personalizadas de alguna manera.

iiz
fuente
Sidewide significa en todas las páginas / publicaciones / categorías, pero no en wp-admin, así que ¿básicamente cualquier página frontend? ps: deshabilitar el complemento W3TC no elimina toda la funcionalidad de almacenamiento en caché de inmediato. La mejor manera es deshabilitar el almacenamiento en caché en la página de opciones principal del complemento y esto realmente suena como un problema de configuración de almacenamiento en caché / caché.
s1lv3r
Sí en sentido lateral significa cualquier página frontend pero nada en wp-admin. No creo que pueda tener nada que ver con el complemento W3 Cache, ya que ocasionalmente tenía este problema en desarrollo antes de que se habilitara.
iiz
2
¿Son esos los únicos tres avisos? Mi presentimiento es que su base de datos se está cayendo, pero eso generalmente generaría su propio aviso.
Matthew Boynes
Solo recibo estos tres avisos exactamente cuando se produce este error. Ocurre entre 2-3 veces por hora y no puedo ver ningún patrón en su tiempo. Puede suceder al intentar acceder a cualquier página, no solo a la página principal / archivos El nivel de inicio de sesión PHP se establece en 32767 [E_ALL]. Creo que anteriormente probé WP_DEBUG y no vi nada pero no puedo estar seguro. Ahora el sitio en cuestión está en vivo [! no hay opción en esto]. Pero puedo hacer otra instalación oculta con los mismos parámetros que esto si crees que valdría la pena.
iiz
1
¿Puede mirar en los registros de acceso al mismo tiempo para averiguar qué solicitud lo desencadena?
jezmck

Respuestas:

1

Hay dos tipos de errores 404: generados por WordPress y generados por el servidor.

En algunos entornos de servidor, el servidor puede mostrar incorrectamente los 404 en casos de sobrecarga de la CPU o debido a ciertas instancias de configuración incorrecta, etc. Por lo general, los errores 404 generados por el servidor dirán algo como "Nginx" o "Apache" en la parte inferior del página (depende del tipo de servidor).

En otras situaciones, WordPress (PHP) podría generar errores 404 "falsos positivos" porque los complementos de seguridad están bloqueando el acceso a los recursos cargados:

¿Por qué a veces recibo un error 404 cuando intento actualizar una página con Elementor?

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

Intente deshabilitar cualquier complemento de seguridad, borrar cachés y actualizar la página. Los módulos de seguridad como ModSecurity instalados en su servidor también podrían ser la causa.

También podría ser causado por un tema o complemento mal codificado. Compruebe si hay un tema o complemento común instalado en todos los sitios involucrados. Y si este problema solo ocurre en el alojamiento de Media Temple, es posible que tengan algo mal configurado, o incluso que su servidor esté bajo demasiada carga ...

Jesse Nickles
fuente
0

No tiene suficiente información para resolver su problema. Intente agregar un seguimiento completo de la pila y solicite información a su registro de errores para investigar un problema.

Puede crear su propio controlador de errores personalizado para agregar el seguimiento de la pila y solicitar información a su registro de errores.

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

Puede verificar si esto funciona agregando trigger_error en algún lugar de su código, por ejemplo, en el single.phparchivo.

trigger_error('Annoying notice');

Su registro de errores debería mostrar algo como eso:

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"

Con este tipo de mensaje, será mucho más fácil descubrir dónde está el problema.

kierzniak
fuente