Ich habe mich gefragt, wie man Fortschritte macht, wie Google Mail.
Ich habe es versucht
%Vor% Und auf index.php
[EDIT] : by sleep()
Ich wollte nur einen kontinuierlichen Ausgabestream wie Multithread-Programme simulieren, der in php
nicht unterstützt wird.
es scheint, dass die Ausgabe sofort ausgegeben wird, so dass ich das Ergebnis 012345678910
auf einmal erhalte.
habe ich auch versucht
%Vor% Stattdessen hatte ich Schwierigkeiten, den Wert von 'progress'
beizubehalten, also tat ich
als Teil meines php. Aber es scheint, dass ich Ajax-Funktion auf kontinuierlichem Intervall anrufe.
Meine Frage ist,
Wie verwendet Google den Fortschrittsbalken beim Anmelden in Google Mail? Erhalten sie Continuos 'stream'
der Daten wie ich versuchte, an meinem ersten Beispiel oder senden (regelmäßig) Anfrage an eine URL (obwohl nicht durch Ajax .. durch JSONP oder was auch immer) und update die Seite wie zweite?
Kann ich das gleiche mit php
tun, auch wenn nicht mit PHP, kann ich das mit Javascript und anderen serverseitigen Skriptsprachen tun, wo Multithreading unterstützt wird?
Ich bin mir nicht sicher, was genau Gmail für die Fortschrittsleiste tut, aber Sie können etwas ähnliches in PHP erreichen, obwohl es ein bisschen schwierig sein kann.
Zuerst, um zu erklären, warum Ihre Beispiele nicht funktionieren:
Wenn Sie echo und schlafen, wie Ihr erstes Beispiel, wird es nie funktionieren. Ajax führt eine vollständige Anforderung aus, dh wenn die Antwort nicht abgeschlossen wird, wartet es. Wenn Sie eine Schleife ausführen und den Ruhezustand aktivieren, wird die Anfrage erst geschlossen, wenn das PHP-Skript beendet ist.
Wenn Sie wie im anderen Beispiel eine Sitzung verwenden, wird das Problem zum Sitzungsspeicher. Der Informationsspeicher ist normalerweise während der Ausführung des Skripts gesperrt und aktualisiert sich nicht selbst, um die Art der Fortschrittsprüfung zu ermöglichen, die Sie möchten.
Sie können den Fortschritt manuell in eine Datei (oder in eine Datenbank) schreiben. Zum Beispiel:
%Vor%Lassen Sie dann ein anderes Skript die Datei lesen und den Inhalt ausgeben.
Dies sollte funktionieren, weil file_put_contents die Datei öffnet, schreibt und schließt.
Eine andere Sprache als PHP würde es einfacher machen. Multithreading würde es möglicherweise einfacher machen, ist aber keine Voraussetzung. Ein fortlaufender Prozess würde es jedoch einfacher machen (PHP führt nur einen Prozess für die Dauer Ihrer Anfrage aus und wird dann beendet)
Ich denke, Google Mail zeigt den Fortschritt an, wenn alle Ressourcen wie JS-Dateien geladen werden. Es gibt verschiedene Möglichkeiten, dies zu tun: Sie könnten alle Ressourcen dynamisch in JS aufnehmen oder Sie könnten alle enthaltenen JS-Dateien darüber informieren, dass sie geladen wurden.
Um PHP eine Teilausgabe zu ermöglichen, verwenden Sie Folgendes:
ob.php
%Vor%.htaccess
%Vor%dieser Thread und dieser Link half mir, eine Lösung für das gleiche Problem zu finden, also stelle ich es für die aufnehmen:
test.php:
%Vor%test.html:
%Vor%... also kann test.php irgendein JOB sein, der einige Sachen macht ... und währenddessen macht ECHOes 100 Zeichen (Bytes) mit blinkendem Puffer.
Meiner Meinung nach können Sie Ihren Login-Prozess in mehrere Teile und Checks unterteilen.
Jede abgeschlossene Teilprüfung sendet eine Antwort auf Ihren Fortschrittsbalken und die Fortschrittsbalkenbreite erhöht diese Muster. Danach sendet die Fortschrittsanzeige die nächste Anfrage an Ihren Login-Prozess für Schritt, bis Sie nicht zu 100% Login und Redirect bekommen.
Tags und Links javascript php ajax progress-bar