Niespójne tymczasowe 404 na całej instalacji | Błąd PHP z post-template.php

9

Jestem głęboko zdezorientowany tym: mam instalację WordPress na Media Temple GS [jeden z wielu, które działają dobrze i są skonfigurowane prawie dokładnie tak samo], co czasami daje mi 404 s na całej stronie. Gdy tak się dzieje, w dzienniku błędów PHP pojawiają się 3 błędy:

[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

Pierwsze dwa dotyczą $postobiektu, a trzecie - tego, get_post()->ID;co myślę, że jest stworzeniem $postobiektu.

Mam dwa z tych samych trzech komunikatów o błędach w odstępie prawie dokładnie 25 minut [wyłączone o 2s].

Próbowałem obsługi MT, ale myślą, że to musi być błąd WP. Korzystam z najnowszej wersji WP, ale mam problem z wcześniejszymi wersjami.

Miałem włączone 2 wtyczki: W3 Total Cache i AJAX Thumbnail Rebuild

Testowałem z wtyczką pamięci podręcznej i bez niej, a problem nadal występuje. Właśnie wyłączyłem wtyczkę miniatury, aby zobaczyć, czy to robi jakąkolwiek różnicę.

Proszę, pomóż mi to doprowadzić do szaleństwa! [i chciałem dzisiaj publicznie uruchomić tę stronę]

EDYTOWAĆ

Powinienem również wspomnieć, że widziałem ten błąd w niektórych, ale nie we wszystkich innych instalacjach WordPress na tym serwerze. Myślę, ale nie mogę być w 100% pewien, że te pokazujące błędy są nowszymi instalacjami niż te, które działają dobrze. Chociaż wszystkie instalacje są w pełni zaktualizowane.

EDYCJA 2

Właśnie pracuję nad innym projektem WP i zrozumiałem przynajmniej, co oznaczają te 3 błędy. Mogę odtworzyć dokładnie te trzy błędy php, przechodząc do strony indeksu niestandardowego typu postu, który nie istnieje. Jednak to nie wyjaśnia, dlaczego spowodowałoby to 404 w tym pytaniu, zwłaszcza że nie dzieje się tak tylko na stronach indeksu niestandardowych typów postów. Myślę jednak, że musi to być w jakiś sposób powiązane z niestandardowymi typami postów.

iiz
źródło
Sidewide oznacza na wszystkich stronach / postach / kategoriach, ale nie we wp-adminie, więc w zasadzie na jakiejkolwiek stronie frontendowej? ps: wyłączenie wtyczki W3TC nie powoduje natychmiastowego usunięcia wszystkich funkcji buforowania. Lepszym sposobem jest wyłączenie buforowania na głównej stronie opcji wtyczki, a to naprawdę brzmi jak problem z konfiguracją buforowania / buforowania.
s1lv3r
Tak boczna oznacza dowolną stronę frontendową, ale nic w wp-admin. Nie sądzę, żeby miało to coś wspólnego z wtyczką W3 Cache, ponieważ miałem ten problem od czasu do czasu, zanim został włączony.
iiz
2
Czy to jedyne trzy powiadomienia? Mam przeczucie, że twoja baza danych jest usuwana, ale zwykle spowodowałoby to jej własne powiadomienie.
Matthew Boynes
Otrzymuję tylko te trzy powiadomienia dokładnie w momencie wystąpienia tego błędu. Dzieje się to 2-3 razy na godzinę i nie widzę żadnego wzorca w czasie. Może się to zdarzyć, gdy próbujesz uzyskać dostęp do dowolnej strony, nie tylko domu / archiwów. Poziom logowania PHP jest ustawiony na 32767 [E_ALL]. Myślę, że wcześniej próbowałem WP_DEBUG i nie widziałem nic, ale nie mogę być pewien. Teraz dana strona jest na żywo [! brak opcji]. Ale mogę zrobić kolejną ukrytą instalację z tymi samymi parametrami, jeśli uważasz, że to byłoby tego warte.
iiz
1
Czy możesz jednocześnie przeglądać dzienniki dostępu, aby dowiedzieć się, które żądanie je uruchamia?
jezmck

Odpowiedzi:

1

Istnieją dwa rodzaje błędów 404: generowane przez WordPress i generowane przez serwer.

W niektórych środowiskach serwerowych serwer 404 może być niedokładnie wyświetlany przez serwer w przypadku przeciążenia procesora lub z powodu pewnych błędów w konfiguracji itp. Zwykle generowane przez serwer błędy 404 powiedzą coś w rodzaju „Nginx” lub „Apache” na dole strona (zależy od typu serwera).

W innych sytuacjach WordPress (PHP) może generować „fałszywie dodatnie” błędy 404, ponieważ wtyczki bezpieczeństwa blokują dostęp do załadowanych zasobów:

Dlaczego czasami dostaję błąd 404, gdy próbuję zaktualizować stronę za pomocą Elementora?

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

Spróbuj wyłączyć wszelkie wtyczki bezpieczeństwa, wyczyść pamięć podręczną i odśwież stronę. Przyczyną mogą być również moduły bezpieczeństwa, takie jak ModSecurity zainstalowane na serwerze.

Przyczyną może być również źle zakodowany motyw lub wtyczka. Sprawdź, czy na wszystkich zaangażowanych stronach jest zainstalowany wspólny motyw lub wtyczka. A jeśli ten problem występuje tylko w przypadku hostingu Media Temple, możliwe, że coś jest źle skonfigurowane, a nawet że serwer jest zbyt obciążony ...

Jesse Nickles
źródło
0

Nie masz wystarczających informacji, aby rozwiązać problem. Spróbuj dodać śledzenie pełnego stosu i zażądaj informacji do dziennika błędów, aby zbadać problem.

Możesz utworzyć własną niestandardową procedurę obsługi błędów, aby dodać dane śledzenia stosu i żądać informacji do dziennika błędów.

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

Możesz sprawdzić, czy to działa, dodając trigger_error gdzieś w kodzie, np. W single.phppliku.

trigger_error('Annoying notice');

Twój dziennik błędów powinien wypisać coś takiego:

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"

Dzięki tego rodzaju wiadomościom o wiele łatwiej będzie dowiedzieć się, gdzie jest problem.

kierzniak
źródło