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_post
meiner 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.Ajax
Funktionsfehlerabschnitt)
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.
Antworten:
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.
quelle
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
quelle