Ich schreibe etwas PHP, das ziemlich viel verarbeitet und dann Berichte über die Ergebnisse erzeugt. Zuvor würde es eine periodische flush () tun, aber wir bewegen uns zu Zend Framework und können das nicht mehr tun. Stattdessen möchte ich eine Art Statusanzeige haben, die aktualisiert wird, während der Bericht generiert wird. Also habe ich einen Fortschrittsbalken erstellt, der in einen iframe geladen wird, der Fortschrittsleiste-Aktualisierungsaktion und der Berichterzeugungsaktion den gemeinsamen Speicher hinzugefügt und die Ausgabe über xmlhttprequest geladen hat. Das alles funktioniert gut. Mein Problem ist, dass der Browser die zwei Anfragen seriell anstatt parallel ausführen möchte, also fordert er den Fortschrittsbalken und dann BLOCK an, bis der Fortschrittsbalken fertig ist, BEVOR er die tatsächliche Ausgabe anfordert. Dies bedeutet, dass der Prozess niemals enden wird, da die eigentliche Arbeit niemals beginnt.
Ich habe den ganzen Morgen nach einem Weg gesucht und kam mit leeren Händen nach oben. Gibt es eine Möglichkeit, zwei Verbindungen zu verursachen, oder bin ich nur geschraubt?
Meine nächste Aktion besteht darin, die Verarbeitung ein wenig zu unterbrechen und die Statusaktualisierungsaktion die eigentliche Arbeit auszuführen, das Ergebnis zu speichern und dann die andere Aktion zu verwenden, um sie zu dumpen. Das wird sehr schmerzhaft sein und ich möchte es vermeiden.
Dies wird vom folgenden Onload-Skript aufgerufen:
%Vor%Das Problem besteht nicht in Javascript. Wenn Sie eine Warnung () dort eingeben, wird die Warnung zur richtigen Zeit ausgelöst, aber der Browser verzögert die zweite HTTP-Transaktion, bis die erste abgeschlossen ist.
Vielen Dank für Ihre Anregungen.
Ich habe innerhalb des von unserem Entwicklungsplan erlaubten Zeitrahmens keine befriedigende Antwort gefunden. Offenbar möchte jeder gängige Browser eine bestehende Verbindung zu einer Site wiederverwenden, wenn mehrere Transaktionen mit dieser Site ausgeführt werden. Nichts, was ich mir vorstellen könnte, würde dazu führen, dass der Browser bei Bedarf eine Parallelverbindung einleitet. Jedes Mal, wenn zwei Anfragen vom selben Server kommen, möchte der Client sie seriell machen.
Am Ende habe ich die Verarbeitung in Teile aufgeteilt und in die Aktualisierungsaktion der Statusleiste verschoben, die Berichtsausgabe in einer temporären Datei auf dem Server gespeichert und dann die Statusleisten-Ende-Funktion veranlasst, die xmlhttprequest zum Laden der Ergebnisse zu initiieren. Die Ausgabeaktion spuckt einfach den Inhalt der temporären Datei aus und löscht sie dann.
Die Verwendung von zwei asynchronen Ajaxen könnte den Trick bewirken. Mit der ersten Ajax-Anfrage sollten Sie den Prozess starten, indem Sie den php-cli aufrufen, um die eigentliche Arbeit tief im Hintergrund zu erledigen (also nicht ablaufen oder abbrechen) und die ID des Prozesses (Task) zurückgeben. Wenn Sie nun die Prozess-ID haben, können Sie den periodischen Ajax starten, um den durchgeführten Prozess anzuzeigen.
Eine db-Tabelle zu erstellen, die Prozess-ID, Status, Benutzer enthält, wäre keine schlechte Sache. In diesem Fall würde der Vorgang selbst dann fortgesetzt, wenn der Benutzer den Browser während der Ausführung des Prozesses schließt. Der Benutzer könnte die Seite erneut aufrufen und den Prozentsatz sehen, der ausgeführt wurde, da der Prozess, der in CLI ausgeführt wird, den Fortschritt in der DB-Tabelle speichern würde.
Machen Sie einen Systemaufruf an die PHP-Datei und trennen Sie sie?
ex:
%Vor%test.php enthält einen Ruhezustand für 2 Sekunden und druckt, aber das Echo kehrt sofort zurück.
Lassen Sie die Ergebnisse in einer Datei / Datenbank / was auch immer speichern. Es wird sich wie eine sehr schmutzige Gabel verhalten.
Sie könnten auch etwas Ähnliches mit einem CURL-Aufruf machen, auf den ich wette, wenn Probleme auftreten.
Kredit hier für das Codebeispiel von bmellink (meins war viel schlimmer als seins).
Wenn Sie den Bericht in den iFrame laden können, können Sie Ihre Logik umkehren (ich habe dies getan, um Datei-Uploads nach PHP zu verfolgen).
Ich hoffe, das hilft. Habe gerade eine Menge mit iFrames, CORS und Ajax Aufrufe an APIs gemacht.
Tags und Links javascript php zend-framework