Uno script PHP si interrompe quando ricevi 504 Gateway Timeout?


8

Sono su un server condiviso (Siteground) e poiché il mio script PHP WordPress richiede più di 30 secondi, restituisce un timeout del gateway 504.

La mia query verrà eseguita e completata se non si verifica un ulteriore errore?

Modifica: ho chiesto perché ho ricevuto questo errore per il mio team di hosting, qui l'esperto di hosting Siteground ha spiegato il problema come segue:

Usiamo sia Apache + Nginx su tutti i nostri server. Apache viene utilizzato per il servizio Web principale, mentre Nginx viene utilizzato come proxy inverso e distribuire cache. Quando la risposta non può essere fornita dalla cache (di solito si riferisce al contenuto dinamico), viene fatta una richiesta da Nginx verso Apache. Questo quando Apache elabora la richiesta, la inoltra al tuo sito Web e, secondo la logica PHP, è possibile eseguire query MySQL o recuperare altri dati. Quando questo processo richiede troppo tempo e Apache non restituisce la risposta in modo tempestivo a Nginx, vedrai questo errore. In breve Apache non può soddisfare la richiesta poiché l'applicazione ha completato il processo entro il tempo consentito. Ciò significa anche che il processo avviato molto probabilmente non è stato completato completamente e alcuni dati / azioni potrebbero essere stati salvati / eseguiti.

L'esperto dice che "initiated process most probably not completed fully",

Maggiori dettagli sul mio scenario: La mia sceneggiatura aggiunge prodotti di woocommerce con variazioni usando il wp_insert_postmetodo al mio sito web wordpress. Dopo aver aggiunto i prodotti, visualizza le immagini dei nuovi prodotti aggiunti.

Quando aggiungo 1 prodotto (40 varianti), completa e visualizza l'immagine del prodotto. Quando aggiungo 6 prodotti (240 varianti), ricevo un errore direttamente nel mio browser.

Quindi, per testare ulteriormente questo problema, ho modificato il mio codice e l'ho riscritto usando Ajax e ho aggiunto una barra del processo come il sistema. (Che incrementa un numero per ogni variazione).

Dopo aver eseguito il codice per 1 prodotto (con 40 varianti), il numero di processo aumenta a 40 e visualizza l'immagine del prodotto.

Quando eseguo il mio codice per 6 prodotti, il numero di processo aumenta a 240, ma non visualizza nulla e quando controllo, viene visualizzato un errore 504. ( jQuery.Ajaxsezione errore funzione)

Quindi questo mi fa pensare che la query viene eseguita anche in timeout, ma non sono ancora in grado di esserne sicuro, e alla ricerca di dettagli tra cui un errore di timeout del gateway 504 poiché non esiste una buona documentazione in merito.


1
Può dipendere da dove proviene il timeout del gateway. Questa è una domanda interessante
Stephen Ostermiller

@StephenOstermiller ha aggiunto alcuni dettagli in base al tuo commento.
HOY,

Presumibilmente sapresti se lo script è stato completato se tutti i "6 prodotti (240 varianti)" sono stati aggiunti al tuo sito web? O è difficile da determinare? Forse aggiungi alcune funzionalità di registrazione al tuo script?
MrWhite,

Risposte:


3

Lo script non smetterà di essere eseguito fino a quando non raggiungerà il timeout php stesso.

L'errore 504 viene generato sul gateway / proxy stesso, non proviene dal processo php.

È perché questo, se hai un Apache con Apache-mod-php non riceverai mai questo errore, perché non c'è un proxy.

Estendendo la spiegazione, pensa come segue:

Hai un processo PHP. Il processo PHP può essere un PHP-FPM, PHP-CGI o Apache-MOD-PHP. In questo processo, hai un timeout (configurato su php.ini o con un ini_set).

Il proxy PHP fornisce una risposta nel tempo consentito (ovvero: se si dispone di un set_time_limit (600), il processo PHP può durare fino a 10 minuti).

Senza relazione con questa frase, puoi avere un altro processo in attesa di questa risposta: è il caso di un apache (configurato per contattare php da cgi o fpm), un nginx, un lighthttpd e altri. Questo non è il caso di un apache configurato da apache-mod-php. Questo secondo processo ha un nuovo timeout (proxy_timeout), configurato nella configurazione dell'app vhost / server generale. Questo è il tempo in cui il programma attenderà una risposta dal motore di elaborazione PHP.

L'ultima frase può essere ripetuta su ciascun proxy / gateway.

Pensa a questo scenario:

haproxy (Timeout 1) -> Nginx (Frontend / cache) (Timeout 2) -> Apache (Timeout 3) -> PHP-FPM (Timeout PHP / set_time_limit).

E uno scenario molto semplice:

Apache (con apache-mod-php) (timeout PHP / set_time_limit).

Ogni aspetto del timeout (ad eccezione del timeout PHP stesso) è una probabile origine di un errore di timeout del gateway HTTP 504.


"se hai un Apache con Apache-mod-php non riceverai mai questo errore" - puoi spiegare quest'ultima frase?
MrWhite,

Quando usi un server Apache con mod-php, l'esecuzione è stata eseguita dallo stesso Apache. Per questo motivo, non è possibile ottenere un timeout 504, poiché non esiste alcun gateway nel processo. Se si utilizza php-cgi o php-fpm, Apache / nginx / alcuni altri server Web agiscono come proxy o gateway per il vero motore di elaborazione. Quindi, viene visualizzato l'errore 504 quando questo gateway non ha ricevuto una risposta per un periodo di tempo configurato.
Sakura Kinomoto,

Ma non puoi avere un proxy inverso Nginx davanti ad Apache mod-php?
MrWhite,

Ovviamente, ma non è questa la domanda. In questo caso, 504 può essere dato da nginx, ma non da Apache. In questo caso, la domanda è: se il codice di errore 504 viene generato dal proxy, l'esecuzione attivata dalla chiamata proxy non viene interrotta. Nel caso di un gateway o proxy, ci sono almeno due timer in gioco. Il timeout della comunicazione proxy (ad esempio su nginx) e il timeout sul processo php.
Sakura Kinomoto,

Capisco. Ma la tua ultima frase sembrerebbe essere incompleta in quel caso, poiché implica che semplicemente usando Apache-mod-php (indipendentemente dal fatto che esista o meno un proxy front-end) si eviterebbe questo errore. Suppongo che cosa intendi è ... "se hai solo un Apache con Apache-mod-php e nessun proxy front-end (Nginx in questo caso), non riceverai mai questo errore"?
MrWhite,

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.