404s temporaires incohérents sur l'ensemble de l'installation | Erreur PHP avec post-template.php


9

Je suis profondément confus par celui-ci: j'ai une installation WordPress sur un Media Temple GS [l'un des nombreux qui fonctionnent bien et sont configurés presque exactement de la même manière], ce qui me donne parfois 404s sur tout le site. Lorsque cela se produit, j'obtiens 3 erreurs ensemble dans mon journal d'erreurs 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

Les deux premiers se rapportent à l' $postobjet et le troisième à ceci: ce get_post()->ID;qui, je pense, est la création de l' $postobjet.

J'ai deux de ces trios identiques de messages d'erreur presque exactement à 25 minutes l'un de l'autre [éteints par 2 secondes].

J'ai essayé le support MT mais ils pensent que ce doit être une erreur WP. J'utilise la dernière version de WP mais j'ai rencontré ce problème avec les versions antérieures.

J'avais 2 plugins activés: W3 Total Cache & AJAX Thumbnail Rebuild

J'ai testé avec et sans le plugin de cache et le problème persiste. Je viens de désactiver la prise miniature pour voir si cela fait une différence.

S'il vous plaît, aidez-moi à devenir fou! [et je voulais lancer publiquement ce site aujourd'hui]

ÉDITER

J'aurais également dû mentionner que j'ai vu cette erreur sur certaines mais pas toutes les autres installations wordpress sur ce serveur. Je pense, mais je ne peux pas être sûr à 100%, que ceux qui montrent des erreurs sont des installations plus récentes que celles qui fonctionnent bien. Bien que toutes les installations soient entièrement mises à jour.

EDIT2

Je travaille juste sur un autre projet WP et j'ai réalisé au moins ce que ces 3 erreurs signifient. Je peux reproduire exactement ces trois erreurs php en accédant à la page d'index d'un type de message personnalisé qui n'existe pas. Cependant, cela n'explique pas pourquoi cela provoquerait le 404 dans cette question, d'autant plus que cela ne se produit pas uniquement sur les pages d'index de type de message personnalisé. Cependant, je pense que cela doit être lié aux types de messages personnalisés d'une manière ou d'une autre.


Sidewide signifie sur toutes les pages / articles / catégories mais pas dans wp-admin, donc fondamentalement n'importe quelle page frontend? ps: la désactivation du plugin W3TC ne supprime pas immédiatement toutes les fonctionnalités de mise en cache. La meilleure façon est de désactiver la mise en cache sur la page principale des options du plugin et cela ressemble vraiment à un problème de configuration de la mise en cache / cache.
s1lv3r

Oui sidewide signifie n'importe quelle page frontale mais rien dans wp-admin. Je ne pense pas que cela puisse avoir quoi que ce soit à voir avec le plugin W3 Cache car j'avais ce problème de temps en temps en développement avant qu'il ne soit activé.
iiz

2
S'agit-il des trois seuls avis? Mon intuition est que votre base de données tombe en panne, mais cela déclencherait généralement sa propre notification.
Matthew Boynes

Je ne reçois que ces trois avis exactement lorsque cette erreur se produit. Cela se produit entre 2-3 fois par heure et je ne vois aucun motif dans son timing. Cela peut se produire lorsque vous essayez d'accéder à n'importe quelle page, pas seulement à la maison / aux archives. Le niveau de connexion PHP est défini sur 32767 [E_ALL]. Je pense que j'ai déjà essayé WP_DEBUG et n'ai rien vu mais je ne peux pas en être sûr. Maintenant, le site en question est en ligne [! aucune option à ce sujet]. Mais je peux faire une autre installation cachée avec les mêmes paramètres que cela si vous pensez que cela en vaut la peine.
iiz

1
Pouvez-vous consulter les journaux d'accès en même temps pour savoir quelle demande le déclenche?
jezmck

Réponses:


1

Il existe deux types d'erreurs 404: générées par WordPress et générées par le serveur.

Dans certains environnements de serveur, les 404 peuvent être affichés de manière inexacte par le serveur en cas de surcharge du processeur ou en raison de certaines erreurs de configuration, etc. Habituellement, les erreurs 404 générées par le serveur indiquent quelque chose comme "Nginx" ou "Apache" au bas de la page (dépend du type de serveur).

Dans d'autres situations, des erreurs 404 "faux positifs" pourraient être générées par WordPress (PHP) car les plugins de sécurité bloquent l'accès aux ressources chargées:

Pourquoi ai-je parfois une erreur 404 lorsque j'essaie de mettre à jour une page avec Elementor?

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

Essayez de désactiver les plug-ins de sécurité, de vider les caches et de rafraîchir la page. Les modules de sécurité tels que ModSecurity installés sur votre serveur pourraient également en être la cause.

Cela peut également être causé par un thème ou un plugin mal codé. Vérifiez si un thème ou un plugin commun est installé sur tous les sites concernés. Et si ce problème ne se produit que sur l'hébergement Media Temple, il est possible qu'ils aient quelque chose de mal configuré, ou même que votre serveur soit trop chargé ...


0

Vous n'avez pas suffisamment d'informations pour résoudre votre problème. Essayez d'ajouter une trace de pile complète et de demander des informations à votre journal des erreurs pour enquêter sur un problème.

Vous pouvez créer votre propre gestionnaire d'erreurs personnalisé pour ajouter une trace de pile et demander des informations à votre journal des erreurs.

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

Vous pouvez vérifier si cela fonctionne en ajoutant trigger_error quelque part dans votre code, par exemple dans un single.phpfichier.

trigger_error('Annoying notice');

Votre journal des erreurs devrait produire quelque chose comme ça:

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"

Avec ce type de message, il sera beaucoup plus facile de découvrir où se situe le problème.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.