Inkonsistente temporäre 404s bei der gesamten Installation | PHP-Fehler mit post-template.php


9

Ich bin zutiefst verwirrt von diesem: Ich habe eine WordPress-Installation auf einem Media Temple GS [einer von vielen, die gut funktionieren und fast genau gleich konfiguriert sind], was mir gelegentlich 404s Sitewide gibt. In diesem Fall werden 3 Fehler in meinem PHP-Fehlerprotokoll angezeigt:

[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

Die ersten beiden beziehen sich auf das $postObjekt und die dritte darauf: get_post()->ID;Was ich denke, ist die Schaffung des $postObjekts.

Ich habe zwei dieser identischen Trios von Fehlermeldungen im Abstand von fast genau 25 Minuten [um 2s versetzt].

Ich habe MT-Unterstützung ausprobiert, aber sie denken, dass es ein WP-Fehler sein muss. Ich verwende die neueste Version von WP, habe dieses Problem jedoch bei früheren Versionen festgestellt.

Ich hatte 2 Plugins aktiviert: W3 Total Cache & AJAX Thumbnail Rebuild

Ich habe mit und ohne Cache-Plugin getestet und das Problem besteht weiterhin. Ich habe gerade den Miniaturbild-Stecker deaktiviert, um zu sehen, ob es einen Unterschied macht.

Bitte helfen Sie, das macht mich verrückt! [und ich wollte diese Seite heute öffentlich starten]

BEARBEITEN

Ich hätte auch erwähnen sollen, dass ich diesen Fehler bei einigen, aber nicht allen anderen WordPress-Installationen auf diesem Server gesehen habe. Ich denke, kann aber nicht 100% sicher sein, dass diejenigen, die Fehler anzeigen, neuere Installationen sind als diejenigen, die gut funktionieren. Alle Installationen sind jedoch vollständig aktualisiert.

EDIT2

Ich arbeite gerade an einem anderen WP-Projekt und habe zumindest erkannt, was diese 3 Fehler bedeuten. Ich kann genau diese drei PHP-Fehler reproduzieren, indem ich zur Indexseite eines benutzerdefinierten Beitragstyps gehe, der nicht existiert. Dies erklärt jedoch nicht, warum dies den 404 in dieser Frage verursachen würde, zumal dies nicht nur auf benutzerdefinierten Indexseiten vom Typ Post geschieht. Ich denke jedoch, dass dies in irgendeiner Weise mit benutzerdefinierten Beitragstypen zusammenhängen muss.


Sidewide bedeutet auf allen Seiten / Posts / Kategorien, aber nicht in wp-admin, also grundsätzlich jede Frontend-Seite? ps: Durch Deaktivieren des W3TC-Plugins werden nicht alle Caching-Funktionen sofort entfernt. Der bessere Weg ist, das Caching auf der Seite mit den Hauptoptionen des Plugins zu deaktivieren. Dies klingt wirklich nach einem Caching- / Cache-Konfigurationsproblem.
s1lv3r

Ja seitlich bedeutet jede Frontend-Seite, aber nichts in wp-admin. Ich glaube nicht, dass es irgendetwas mit dem W3-Cache-Plugin zu tun haben kann, da ich dieses Problem gelegentlich in der Entwicklung hatte, bevor es aktiviert wurde.
iiz

2
Sind das die einzigen drei Hinweise? Meine Vermutung ist, dass Ihre Datenbank ausfällt, aber das würde normalerweise eine eigene Benachrichtigung auslösen.
Matthew Boynes

Ich bekomme nur diese drei Hinweise genau, wenn dieser Fehler auftritt. Es passiert zwischen 2-3 mal pro Stunde und ich kann kein Muster in seinem Timing sehen. Dies kann passieren, wenn versucht wird, auf eine Seite zuzugreifen, nicht nur auf Home / Archive. Die Stufe der PHP-Protokollierung ist auf 32767 [E_ALL] eingestellt. Ich glaube, ich habe zuvor WP_DEBUG ausprobiert und nichts gesehen, kann aber nicht sicher sein. Jetzt ist die fragliche Seite live [! keine Option dazu]. Aber ich kann eine andere versteckte Installation mit den gleichen Parametern wie diese durchführen, wenn Sie denken, dass sich das lohnt.
nämlich

1
Können Sie gleichzeitig in den Zugriffsprotokollen nachsehen, welche Anforderung sie auslöst?
Jezmck

Antworten:


1

Es gibt zwei Arten von 404-Fehlern: WordPress-generiert und Server-generiert.

In einigen Serverumgebungen können 404s vom Server in Fällen von CPU-Überlastung oder aufgrund bestimmter Fälle von Fehlkonfiguration usw. ungenau angezeigt werden. Normalerweise sagen vom Server generierte 404-Fehler etwas wie "Nginx" oder "Apache" am unteren Rand des Seite (abhängig vom Servertyp).

In anderen Situationen können von WordPress (PHP) "falsch positive" 404-Fehler generiert werden, da Sicherheits-Plugins den Zugriff auf geladene Ressourcen blockieren:

Warum wird manchmal ein 404-Fehler angezeigt, wenn ich versuche, eine Seite mit Elementor zu aktualisieren?

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

Deaktivieren Sie alle Sicherheits-Plugins, löschen Sie die Caches und aktualisieren Sie die Seite. Sicherheitsmodule wie ModSecurity, die auf Ihrem Server installiert sind, können möglicherweise ebenfalls die Ursache sein.

Dies kann auch durch ein schlecht codiertes Thema oder Plugin verursacht werden. Überprüfen Sie, ob auf allen beteiligten Websites ein gemeinsames Thema oder Plugin installiert ist. Und wenn dieses Problem nur beim Hosting von Media Temple auftritt, ist möglicherweise etwas falsch konfiguriert oder sogar Ihr Server ist zu stark ausgelastet ...


0

Sie haben nicht genügend Informationen, um Ihr Problem zu lösen. Versuchen Sie, Ihrem Fehlerprotokoll eine vollständige Stapelverfolgung hinzuzufügen und Informationen anzufordern, um ein Problem zu untersuchen.

Sie können Ihren eigenen benutzerdefinierten Fehlerhandler erstellen, um Stack-Trace hinzuzufügen und Informationen zu Ihrem Fehlerprotokoll anzufordern.

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

Sie können überprüfen, ob dies funktioniert, indem Sie trigger_error irgendwo in Ihrem Code hinzufügen, z single.php. B. in einer Datei.

trigger_error('Annoying notice');

Ihr Fehlerprotokoll sollte ungefähr Folgendes ausgeben:

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"

Mit dieser Art von Nachricht ist es viel einfacher herauszufinden, wo das Problem liegt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.