Kann ein PHP-Skript, um den Browser zu denken, die HTTP-Anforderung Trick ist vorbei?
-
07-07-2019 - |
Frage
ich konfigurieren mein Skript zunächst auch nach der HTTP-Anforderung ist über
laufen ignore_user_abort(true);
dann Text auszuspülen.
echo "Thats all folks!";
flush();
Nun, wie kann ich den Browser Trick zu denken, die HTTP-Anforderung ist vorbei? so kann ich meine eigene Arbeit ohne den Browser zeigt „Laden der Seite“ weiterhin tun.
header(??) // something like this?
Lösung
Hier ist, wie es zu tun. Sie sagen dem Browser in den ersten N Zeichen der Ausgabe zu lesen und dann die Verbindung schließen, während das Skript ausgeführt hält, bis es fertig ist.
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(true); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Will not work
flush(); // Unless both are called !
// At this point, the browser has closed connection to the web server
// Do processing here
echo('Text user will never see');
?>
Andere Tipps
Headers wird nicht funktionieren (sie sind Header, so kommen sie erste )
Ich weiß nicht, von irgendeiner Weise der HTTP-Verbindung zu schließen, ohne das Skript beendet wird, obwohl ich es nehme ist etwas obskure Art und Weise tun.
sagen uns, was Sie tun wollen, nachdem die Anforderung uns bessere Vorschläge geben würde helfen, durchgeführt wird.
Aber im Allgemeinen, würde ich über eine der folgenden Möglichkeiten denken:
1) Führen Sie einige einfache Befehlszeilenskript (exec ()), die wie folgt aussieht:
#!/bin/sh
php myscript.php <arg1> <arg2> .. <argN> &
Dann, dass von Ihrem http gebundenen Skript kick off wie:
<?PHP
exec('/path/to/my/script.sh');
?>
Oder:
Schreiben2) ein anderes Programm (möglicherweise einen kontinuierlich laufenden Daemon, oder einfach nur ein Skript, das jemals so oft cronned ist), und herauszufinden, wie Ihr in-Anforderungscode ihm Anweisungen passieren kann. Sie könnten eine Datenbanktabelle, die Arbeitswarteschlangen, oder versuchen Sie es mit einer flachen Datei von einer Art zu arbeiten. Sie können auch Ihren Web-basierten Skriptaufruf eine Befehlszeile, die Ihren Out-of-Anfrage verursacht Skript einige Arbeit in der Warteschlange.
Am Ende des Tages, die Sie nicht will Ihr Skript nach der HTTP-Anforderung der Ausführung zu halten. Angenommen, Sie mod_php verwenden, das bedeutet, dass Sie einen Apache-Prozess binden werden, bis das Skript beendet wird.
Vielleicht dieser besondere Kommentar auf php.net Handbuch Seite helfen:
Theoretisch, wenn HTTP 1.1-Keep-Alive aktiviert ist und der Kunde erhält die Menge der Zeichen vom Server erwartet, sollte es es als das Ende der Reaktion zu behandeln und gehen Sie vor und macht die Seite (während der Verbindung noch halten Versuchen offen) diese Header zu senden (wenn Sie ihnen eine andere Art und Weise nicht aktivieren können.): Wo Connection: keep-alive
Content-Length: n
n
ist die Menge der Zeichen, die Sie im Antworttext gesendet haben (Ausgabepufferung kann Ihnen helfen, das zählt.) Es tut mir leid, dass ich das selbst nicht die Zeit haben, zu testen. Ich bin nur in den Vorschlag für den Fall, werfen es funktioniert.
Der beste Weg, um dies zu erreichen Ausgabepufferung verwendet. PHP sendet die Header, wenn es gut und bereit, aber wenn Sie Ihre Ausgabe an den Browser mit ob_ wickeln * Sie die Header jeden Schritt des Weges steuern kann.
Sie können eine gerenderte Seite im Puffer halten, wenn Sie Header möchten und senden, bis die Sonne in China kommt. Diese Praxis ist, warum Sie eine Menge Öffnen <?php
Tags sehen kann, aber keine schließenden Tags heutzutage. Es hält das Skript aus allen Header vorzeitig zu senden, da könnte es einige betrachten enthält.