Wird ein PHP-Skript nicht mehr ausgeführt, wenn Sie 504 Gateway Timeout erhalten?

8

Ich bin auf einem gemeinsam genutzten Server (Siteground) und da mein WordPress-PHP-Skript mehr als 30 Sekunden dauert, wird ein 504-Gateway-Timeout zurückgegeben.

Wird meine Abfrage ausgeführt und abgeschlossen, wenn kein weiterer Fehler auftritt?

Bearbeiten: Ich habe mein Hosting-Team gefragt, warum ich diesen Fehler erhalten habe. Hier hat der Siteground-Hosting-Experte das Problem wie folgt erklärt:

Wir verwenden beide Apache + Nginx auf allen unseren Servern. Apache wird für den Hauptwebdienst verwendet, während Nginx als Reverse-Proxy- und Distribute-Cache verwendet wird. Wenn die Antwort nicht aus dem Cache bereitgestellt werden kann (normalerweise bezieht sich dies auf dynamischen Inhalt), wird eine Anforderung von Nginx an Apache gesendet. Dies geschieht, wenn Apache die Anfrage verarbeitet, an Ihre Website weiterleitet und gemäß der PHP-Logik MySQL-Abfragen durchgeführt oder andere Daten abgerufen werden können. Wenn dieser Vorgang zu lange dauert und Apache die Antwort nicht rechtzeitig an Nginx zurücksendet, wird dieser Fehler angezeigt. Kurz gesagt, Apache kann die Anforderung nicht bedienen, da die Anwendung den Vorgang innerhalb der zulässigen Zeit abgeschlossen hat. Dies bedeutet auch, dass der initiierte Prozess höchstwahrscheinlich nicht vollständig abgeschlossen wurde und einige Daten / Aktionen möglicherweise gespeichert / ausgeführt wurden.

Der Experte sagt das "initiated process most probably not completed fully",

Weitere Details zu meinem Szenario: Mein Skript fügt wp_insert_postmeiner WordPress-Website Woocommerce-Produkte mit Variationen mithilfe der Methode hinzu . Nach dem Hinzufügen von Produkten werden die Bilder neu hinzugefügter Produkte angezeigt.

Wenn ich 1 Produkt (40 Variationen) hinzufüge, wird das Produktbild vervollständigt und angezeigt. Wenn ich 6 Produkte (240 Variationen) hinzufüge, erhalte ich eine Fehlermeldung direkt in meinem Browser.

Um dieses Problem weiter zu testen, habe ich meinen Code geändert und mit Ajax neu geschrieben und eine Prozessleiste wie ein System hinzugefügt. (Womit eine Zahl für jede Variation erhöht wird).

Nachdem ich den Code für 1 Produkt (mit 40 Variationen) ausgeführt habe, erhöht sich die Prozessnummer auf 40 und es wird das Produktbild angezeigt.

Wenn ich meinen Code für 6 Produkte ausführe, erhöht sich die Prozessnummer auf 240, aber es wird nichts angezeigt, und wenn ich das überprüfe, wird ein 504-Fehler angezeigt. ( jQuery.AjaxFunktionsfehlerabschnitt)

Das lässt mich denken, dass die Abfrage auch Timeouts ausführt, aber ich bin mir immer noch nicht sicher und suche nach Details bezüglich eines 504-Gateway-Timeout-Fehlers, da es keine gute Dokumentation dazu gibt.

HOY
quelle
1
Dies hängt möglicherweise davon ab, woher das Gateway-Timeout stammt. Dies ist eine interessante Frage.
Stephen Ostermiller
@StephenOstermiller hat basierend auf Ihrem Kommentar einige weitere Details hinzugefügt.
HOY
Vermutlich würden Sie wissen, ob das Skript abgeschlossen ist, wenn alle "6 Produkte (240 Variationen)" zu Ihrer Website hinzugefügt wurden? Oder ist das schwer zu bestimmen? Fügen Sie Ihrem Skript möglicherweise einige Protokollierungsfunktionen hinzu?
MrWhite

Antworten:

3

Das Skript wird nicht beendet, bis das PHP-Timeout selbst erreicht ist.

Der 504-Fehler wird auf dem Gateway / Proxy selbst generiert, er kommt nicht vom PHP-Prozess.

Dies liegt daran, dass Sie diesen Fehler niemals erhalten, wenn Sie einen Apache mit Apache-mod-php haben, da es keinen Proxy gibt.

Denken Sie bei der Erweiterung der Erklärung wie folgt:

Sie haben einen PHP-Prozess. Der PHP-Prozess kann ein PHP-FPM, PHP-CGI oder Apache-MOD-PHP sein. Bei diesem Vorgang haben Sie eine Zeitüberschreitung (konfiguriert auf php.ini oder mit einem ini_set).

Der PHP-Proxy gibt eine Antwort in der zulässigen Zeit (auch bekannt als: Wenn Sie ein set_time_limit (600) haben, kann Ihr PHP-Prozess bis zu 10 Minuten laufen).

Ohne Bezug zu diesem Satz kann ein anderer Prozess auf diese Antwort warten: Dies ist der Fall bei einem Apachen (konfiguriert für die Kontaktaufnahme mit PHP über CGI oder Fpm), einem Nginx, einem Lighthttpd und anderen. Dies ist bei einem von apache-mod-php konfigurierten Apache nicht der Fall. Für diesen zweiten Prozess wird ein neues Zeitlimit (proxy_timeout) festgelegt, das in der Konfiguration der vhost / general server app konfiguriert ist. In dieser Zeit wartet das Programm auf eine Antwort der PHP-Verarbeitungs-Engine.

Der letzte Satz kann auf jedem Proxy / Gateway wiederholt werden.

Denken Sie an dieses Szenario:

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

Und ein sehr einfaches Szenario:

Apache (mit Apache-Mod-PHP) (PHP Timeout / set_time_limit).

Jedes Timeout-Erscheinungsbild (mit Ausnahme des PHP-Timeouts selbst) ist ein wahrscheinlicher Ursprung eines 504-HTTP-Gateway-Timeout-Fehlers.

Sakura Kinomoto
quelle
"Wenn Sie einen Apache mit Apache-mod-php haben, werden Sie diesen Fehler nie erhalten" - können Sie diesen letzten Satz erklären?
MrWhite
Wenn Sie einen Apache-Server mit mod-php verwenden, wurde die Ausführung von Apache selbst durchgeführt. Aus diesem Grund können Sie kein 504-Timeout erhalten, da der Prozess kein Gateway enthält. Wenn Sie php-cgi oder php-fpm verwenden, fungieren Apache / nginx / ein anderer Webserver als Proxy oder Gateway zur realen Verarbeitungs-Engine. Dann wird ein 504-Fehler angezeigt, wenn dieses Gateway in einer konfigurierten Zeit keine Antwort erhalten hat.
Sakura Kinomoto
Aber können Sie nicht einen Nginx-Reverse-Proxy vor Apache mod-php haben?
MrWhite
Natürlich, aber das ist nicht die Frage selbst. In diesem Fall kann 504 von nginx angegeben werden, nicht jedoch von Apache. Die Frage in diesem Fall ist, wer, wenn der 504-Fehlercode vom Proxy generiert wird, die durch den Proxy-Aufruf ausgelöste Ausführung nicht gestoppt wird. Bei einem Gateway oder Proxy sind mindestens zwei Timer im Spiel. Das Zeitlimit für die Proxy-Kommunikation (z. B. auf Nginx) und das Zeitlimit für den PHP-Prozess.
Sakura Kinomoto
Ich verstehe. Ihr letzter Satz scheint in diesem Fall jedoch unvollständig zu sein, da dies impliziert, dass die einfache Verwendung von Apache-mod-php (unabhängig davon, ob es einen Front-End-Proxy gibt oder nicht) diesen Fehler vermeiden würde. Ich nehme an, Sie meinen ... "Wenn Sie nur einen Apache mit Apache-mod-php und keinen Front-End-Proxy (in diesem Fall Nginx) haben, werden Sie diesen Fehler nie erhalten"?
MrWhite
1

Nach meinem Verständnis wird das Skript zwar weiterhin ausgeführt, es werden jedoch keine Daten mehr an den Client gemeldet. (Nicht, dass ich das Wissen hätte, um es zu erklären.) Hier ist ein Artikel, der helfen könnte:

So beheben Sie einen 504 Gateway Timeout-Fehler in WordPress

elbrant
quelle