Mein Skript wird vom Server aufgerufen. Vom Server werde ich ID_OF_MESSAGE
und erhalten TEXT_OF_MESSAGE
.
In meinem Skript werde ich eingehenden Text verarbeiten und eine Antwort mit params generieren: ANSWER_TO_ID
und RESPONSE_MESSAGE
.
Das Problem ist, dass ich eine Antwort auf eingehende "ID_OF_MESSAGE"
Nachrichten sende , aber der Server, der mir die zu behandelnde Nachricht sendet, setzt seine Nachricht als an mich zugestellt (dies bedeutet, dass ich ihm eine Antwort auf diese ID senden kann), nachdem er die http-Antwort 200 erhalten hat.
Eine der Lösungen besteht darin, die Nachricht in der Datenbank zu speichern und ein Cron zu erstellen, das jede Minute ausgeführt wird. Ich muss jedoch sofort eine Antwortnachricht generieren.
Gibt es eine Lösung, wie man eine HTTP-Antwort 200 an den Server sendet und dann das PHP-Skript weiter ausführt?
Vielen Dank
header("Content-Encoding: none")
fastcgi_finish_request()
am Ende hinzufügenIch habe hier viele Antworten gesehen, die die Verwendung vorschlagen,
ignore_user_abort(true);
aber dieser Code ist nicht erforderlich. Dies stellt lediglich sicher, dass Ihr Skript weiterhin ausgeführt wird, bevor eine Antwort gesendet wird, falls der Benutzer den Vorgang abbricht (indem er seinen Browser schließt oder die Esc-Taste drückt, um die Anforderung zu stoppen). Aber das fragst du nicht. Sie möchten die Ausführung fortsetzen, nachdem eine Antwort gesendet wurde. Sie benötigen lediglich Folgendes:Wenn Sie befürchten, dass Ihre Hintergrundarbeit länger dauert als das Standard-Zeitlimit für die Skriptausführung von PHP, bleiben Sie
set_time_limit(0);
oben.quelle
Wenn Sie FastCGI-Verarbeitung oder PHP-FPM verwenden, können Sie:
Quelle: https://www.php.net/manual/en/function.fastcgi-finish-request.php
PHP-Problem Nr. 68722: https://bugs.php.net/bug.php?id=68772
quelle
Ich habe ein paar Stunden mit diesem Problem verbracht und bin mit dieser Funktion gekommen, die auf Apache und Nginx funktioniert:
Sie können diese Funktion vor Ihrer langen Verarbeitung aufrufen.
quelle
filter_input
Funktion, die manchmal NULL zurückgibt. siehe diesen Benutzerbeitrag für DetailsDie Antwort von @vcampitelli wurde ein wenig geändert. Glaube nicht, dass du den
close
Header brauchst . Ich habe in Chrome doppelte geschlossene Header gesehen.quelle
Ich benutze dafür die PHP-Funktion register_shutdown_function.
http://php.net/manual/en/function.register-shutdown-function.php
Bearbeiten : Das obige funktioniert nicht. Es scheint, dass ich durch eine alte Dokumentation in die Irre geführt wurde. Das Verhalten von register_shutdown_function ist seit PHP 4.1 geändert Link Link
quelle
Ich kann pthread nicht installieren und die vorherigen Lösungen funktionieren auch nicht für mich. Ich habe nur die folgende Lösung gefunden (Ref: https://stackoverflow.com/a/14469376/1315873 ):
quelle
Bei Verwendung von PHP-Datei_get_contents reicht das Schließen der Verbindung nicht aus. PHP warten noch auf Eof Hexe vom Server gesendet.
Meine Lösung besteht darin, "Inhaltslänge:" zu lesen.
Hier ist ein Beispiel:
response.php:
Beachten Sie das "\ n" als Antwort auf das Schließen der Zeile, wenn nicht das fget gelesen wird, während Sie warten.
read.php:
Wie Sie sehen können, wartet dieses Skript nicht auf eof, wenn die Länge des Inhalts erreicht ist.
hoffe es wird helfen
quelle
Diese Frage habe ich Rasmus Lerdorf im April 2012 unter Berufung auf folgende Artikel gestellt:
Ich schlug die Entwicklung einer neuen integrierten PHP-Funktion vor, um die Plattform darüber zu informieren, dass keine weitere Ausgabe (auf stdout?) Erzeugt wird (eine solche Funktion könnte das Schließen der Verbindung übernehmen). Rasmus Lerdorf antwortete:
Ich kann seinen Standpunkt sehen und seine Meinung für einige Anwendungen / Ladeszenarien unterstützen! In einigen anderen Szenarien sind die Lösungen von vcampitelli et al.
quelle
Ich habe etwas, das komprimiert und die Antwort senden und anderen PHP-Code ausführen lassen kann.
quelle
Es gibt einen anderen Ansatz, und es lohnt sich zu überlegen, ob Sie die Antwortheader nicht manipulieren möchten. Wenn Sie einen Thread in einem anderen Prozess starten, wartet die aufgerufene Funktion nicht auf ihre Antwort und kehrt mit einem endgültigen http-Code zum Browser zurück. Sie müssen pthread konfigurieren .
Sobald wir $ continue_processing-> start () ausführen, wartet PHP nicht auf das Rückgabeergebnis dieses Threads und daher auf rest_endpoint. Es ist vollbracht.
Einige Links zur Unterstützung von Pthreads
Viel Glück.
quelle
Ich weiß, dass es alt ist, aber möglicherweise an dieser Stelle nützlich.
Mit dieser Antwort unterstütze ich nicht die eigentliche Frage, sondern wie man dieses Problem richtig löst. Ich hoffe, es hilft anderen Menschen, solche Probleme zu lösen.
Ich würde vorschlagen, RabbitMQ oder ähnliche Dienste zu verwenden und die Hintergrund-Workload mithilfe von Worker-Instanzen auszuführen . Es gibt ein Paket namens amqplib für PHP, das die ganze Arbeit für Sie erledigt, um RabbitMQ zu verwenden.
Profis:
Neg's:
quelle