Situation:
Ich verwende einen $ .ajax () POST, um eine Anfrage an ein PHP-Skript zu senden, das etwa 400.000-500.000 Zeilen in eine db einfügt. Dies dauert dauernd ca. 3,5 - 4 Minuten. (Während dieser Zeit ist die Anfrage PENDING).
Problem:
Ich brauche eine Möglichkeit, den Fortschritt auf der Seite zu zeigen. (so wie ein %). Ich habe versucht, ein $ .ajax () in einem setInterval zu verwenden, das alle 5 Sekunden oder so überprüft, aber sie scheinen aufzubauen und alle kommen durch, wenn das erste (längere) $ .ajax () beendet ist.
Frage:
Ist $ .ajax () async standardmäßig nicht? Sollte dies nicht bedeuten, können Anfragen in jeder Reihenfolge und zu jeder Zeit gesendet werden und Antworten sollten in jeder Reihenfolge und zu jeder Zeit empfangen werden. Hat das überhaupt etwas mit Async zu tun? Gibt es eine Möglichkeit, periodisch 'Semi-Response' aus einer Anfrage zu senden? Oder kann ich Anfragen / Antworten nicht senden und empfangen, während eine Anfrage / Antwort aussteht? (siehe untenstehende Zeichnung)
Vielen Dank im Voraus !!!
Ihr lang andauernder Ajax-Anruf öffnet wahrscheinlich eine Sitzung auf dem Server, so dass alle nächsten Anfragen aufgrund einer Sitzungsdateisperre blockiert werden.
Problem: PHP schreibt seine Sitzungsdaten standardmäßig in eine Datei. Wenn eine Anfrage an ein PHP-Skript gestellt wird, das die Sitzung startet (session_start ()), ist diese Sitzungsdatei gesperrt. Das heißt, wenn Ihre Webseite zahlreiche Anfragen an PHP-Skripte stellt, zum Beispiel, um Inhalte über Ajax zu laden, kann jede Anfrage die Sitzung sperren und verhindern, dass die anderen Anfragen abgeschlossen werden. Die anderen Anforderungen hängen an session_start (), bis die Sitzungsdatei entsperrt ist. Dies ist besonders schlimm, wenn eine Ihrer Ajax-Anfragen relativ lange dauert.
Lösung: Die Sitzungsdatei bleibt gesperrt, bis das Skript abgeschlossen oder die Sitzung manuell geschlossen wird. Um zu verhindern, dass mehrere PHP-Anfragen (die $ _SESSION-Daten benötigen) blockiert werden, können Sie die Sitzung starten und dann die Sitzung schließen. Dadurch wird die Sitzungsdatei entsperrt und die verbleibenden Anforderungen können noch ausgeführt werden, noch bevor die erste Anforderung abgeschlossen wurde.
Weitere Infos hier: Ссылка
Anstatt einen Ajax-Post zu schreiben, können Sie einen Iframe posten und php eine inkrementelle Ausgabe erzeugen lassen und diese mit der Flush Befehl.
%Vor%Es wäre dann auch möglich, den Inhalt des iFrame abzufragen, um dem Endbenutzer eine schöne Anzeige zu bieten.
Ich hoffe, dass dies für Sie nützlich sein wird
Zuerst müssen Sie den Ausgabepuffer in Ihrem PHP-Skript deaktivieren
%Vor%Dann müssen Sie Ihren Fortschritt während des Prozesses von PHP abgleichen, etwa so:
%Vor%Dann müssen Sie in Javascript auf xhr readystate change-Ereignis warten und wenn dies passiert, einfach den Antworttext analysieren und den Fortschritt anzeigen, wie Sie möchten.
auf Ereignis hören:
%Vor%und Beispiel einer Ajax-Anfrage:
%Vor%getestet mit jQuery 1.5 +