404 temporanei non coerenti sull'intera installazione | Errore PHP con post-template.php


9

Sono profondamente confuso da questo: ho un'installazione WordPress su un Media Temple GS [uno dei tanti che funzionano bene e sono configurati quasi esattamente lo stesso] che occasionalmente mi dà 404 in tutto il sito. Quando ciò accade, ricevo 3 errori insieme nel mio registro errori 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

I primi due si riferiscono $postall'oggetto e il terzo a questo: get_post()->ID;che penso sia la creazione $postdell'oggetto.

Ho due di questi identici trii di messaggi di errore distanti quasi esattamente 25 minuti [fuori da 2 secondi].

Ho provato il supporto MT ma pensano che debba essere un errore WP. Sto eseguendo l'ultima versione di WP ma ho riscontrato questo problema con le versioni precedenti.

Avevo abilitato 2 plugin: W3 Total Cache e AJAX Thumbnail Rebuild

Ho provato con e senza il plug-in della cache e il problema persiste. Ho appena disabilitato il plug in miniatura per vedere se fa differenza.

Aiutatemi, questo mi sta facendo impazzire! [e volevo lanciare pubblicamente questo sito oggi]

MODIFICARE

Avrei dovuto anche menzionare che ho visto questo errore su alcune ma non tutte le altre installazioni di wordpress su questo server. Penso, ma non posso essere sicuro al 100%, che quelli che mostrano errori siano installazioni più recenti di quelle che funzionano bene. Sebbene tutte le installazioni siano completamente aggiornate.

EDIT2

Sto solo lavorando su un altro progetto WP e ho capito almeno cosa significano questi 3 errori. Posso riprodurre esattamente questi tre errori php andando alla pagina dell'indice di un tipo di post personalizzato che non esiste. Tuttavia, questo non spiega perché ciò causerebbe il 404 in questa domanda, soprattutto perché non si verifica solo sulle pagine dell'indice del tipo di post personalizzato. Tuttavia, penso che questo debba essere in qualche modo correlato ai tipi di post personalizzati.


Sidewide significa su tutte le pagine / post / categorie ma non in wp-admin, quindi praticamente qualsiasi pagina di frontend? ps: la disabilitazione del plug-in W3TC non rimuove immediatamente tutte le funzionalità di memorizzazione nella cache. Il modo migliore è disabilitare la memorizzazione nella cache nella pagina delle opzioni principali del plugin e questo suona davvero come un problema di configurazione della cache / cache.
s1lv3r,

Sì lateralmente significa qualsiasi pagina di frontend ma niente in wp-admin. Non penso che possa avere nulla a che fare con il plug-in W3 Cache poiché avevo questo problema occasionalmente in fase di sviluppo prima che fosse abilitato.
Iiz

2
Quelle sono le uniche tre comunicazioni? La mia impressione è che il tuo database stia abbandonando, ma questo di solito innescherebbe un suo avviso.
Matthew Boynes,

Ricevo solo questi tre avvisi esattamente quando si verifica questo errore. Succede tra 2-3 volte all'ora e non riesco a vedere alcun modello nei suoi tempi. Può succedere quando si tenta di accedere a qualsiasi pagina non solo a casa / archivi. Il livello di accesso a PHP è impostato su 32767 [E_ALL]. Penso di aver già provato WP_DEBUG e di non aver visto nulla ma non posso esserne sicuro. Ora il sito in questione è live [! nessuna opzione su questo]. Ma posso fare un'altra installazione nascosta con gli stessi parametri di questa se pensi che ne varrebbe la pena.
Iiz

1
Puoi guardare contemporaneamente nei log di accesso per scoprire quale richiesta lo sta attivando?
jezmck,

Risposte:


1

Esistono due tipi di errori 404: generati da WordPress e generati dal server.

In alcuni ambienti server, 404s potrebbero essere visualizzati in modo errato dal server in caso di sovraccarico della CPU o a causa di alcuni casi di configurazione errata, ecc. Solitamente gli errori 404 generati dal server diranno qualcosa come "Nginx" o "Apache" nella parte inferiore del pagina (dipende dal tipo di server).

In altre situazioni, WordPress (PHP) potrebbe generare errori "falsi positivi" 404 perché i plug-in di sicurezza bloccano l'accesso alle risorse caricate:

Perché a volte ricevo un errore 404 quando provo ad aggiornare una pagina con Elementor?

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

Prova a disabilitare eventuali plug-in di sicurezza, svuota le cache e aggiorna la pagina. Moduli di sicurezza come ModSecurity installati sul tuo server potrebbero essere potenzialmente la causa.

Potrebbe anche essere causato da un tema o plugin scarsamente codificati. Controlla se c'è un tema comune o un plugin installato su tutti i siti coinvolti. E se questo problema si verifica solo sull'hosting di Media Temple, è possibile che abbiano qualcosa di non configurato correttamente o che il tuo server sia troppo carico ...


0

Non hai abbastanza informazioni per risolvere il tuo problema. Prova ad aggiungere la traccia dello stack completo e richiedi informazioni al log degli errori per esaminare un problema.

È possibile creare il proprio gestore errori personalizzato per aggiungere la traccia dello stack e richiedere informazioni al registro errori.

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

Puoi verificare se funziona aggiungendo trigger_error da qualche parte nel tuo codice, ad esempio nel single.phpfile.

trigger_error('Annoying notice');

Il tuo log degli errori dovrebbe generare qualcosa del genere:

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 questo tipo di messaggio sarà molto più facile scoprire dove si trova il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.