Wie die Anzeige be-Anteil und wie es zu tun, ohne javascript?
Möchte ich etwas ähnliches zu Lader in PHP
so habe ich diese code:
<?php
$x=1;
while($x<=100) {
echo "Loading: $x %<br>";
$x++;
}
?>
So, dass es die Anzeige von "Loading 1%" bis "Loading 100%".
Aber dies wird dazu führen, dass alle erscheinen ein zu einer Zeit ohne verschwand, nachdem die neue Zeile erscheint. Ich will also wissen, wie zu machen die neue Zeile angezeigt, und die alten verschwinden, und diese beginnt, nachdem die Seite geladen, so wird der Benutzer in der Lage sein, zu beobachten, eine loader eigentlich Beladung von 1% bis 100%.
UPDATE: ich weiß, ich sollte verwenden, JS und/oder Ajax um es zu erreichen, ich wollte nur wissen, ob es einen Weg gibt, kann es auch in PHP 🙂
Fügen Sie einige javascript, um es zu entfernen oder ersetzen Sie es, oder ajax verwenden, um den server Abfragen für die Linie.
Ja, das wäre wahrscheinlich einfacher gemacht, in JavaScript. Und wenn Sie gerade dabei ein random-Schleife, es wird nicht wirklich etwas damit zu tun haben, wie weit die Seite geladen ist. Plus eine Schleife von 100, dass ist nur echo wird im Grunde sofort... Computer sind verdammt schnell.
Ja, ich verstehe nicht, warum du denkst, dass das Verhalten anders sein würde, als das, was Sie bekommen. Es gibt keine Möglichkeit, un-echo-Ausgabe, sobald es an den browser gesendet wird.
Während Ungepuffert server-seitigen scripts Verhalten sich wie die interaktive Konsole-Programme, Sie können nicht annehmen, dass keine Knoten zwischen Ihnen und der browser nicht so funktioniert wie ein Puffer, und es ist eine schlechte Idee zu blockieren, die die Seite-processing-pipeline, wie dies auch.
Ich weiß, ich sollte verwenden, JS und/oder Ajax, um es zu erreichen, ich wollte nur wissen, ob es einen Weg gibt, kann es auch in PHP 🙂
Ja, das wäre wahrscheinlich einfacher gemacht, in JavaScript. Und wenn Sie gerade dabei ein random-Schleife, es wird nicht wirklich etwas damit zu tun haben, wie weit die Seite geladen ist. Plus eine Schleife von 100, dass ist nur echo wird im Grunde sofort... Computer sind verdammt schnell.
Ja, ich verstehe nicht, warum du denkst, dass das Verhalten anders sein würde, als das, was Sie bekommen. Es gibt keine Möglichkeit, un-echo-Ausgabe, sobald es an den browser gesendet wird.
Während Ungepuffert server-seitigen scripts Verhalten sich wie die interaktive Konsole-Programme, Sie können nicht annehmen, dass keine Knoten zwischen Ihnen und der browser nicht so funktioniert wie ein Puffer, und es ist eine schlechte Idee zu blockieren, die die Seite-processing-pipeline, wie dies auch.
Ich weiß, ich sollte verwenden, JS und/oder Ajax, um es zu erreichen, ich wollte nur wissen, ob es einen Weg gibt, kann es auch in PHP 🙂
InformationsquelleAutor Marwan Ossama | 2014-04-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgen lang andauernde Aufgaben ist üblich, aber nicht wirklich leicht umzusetzen das erste mal. Hier ist ein komplettes Beispiel.
(eine Probe von lang-laufende task in einem Sellermania's-Produkt)
Kontext
Die Aufgabe
Stellen Sie sich vor Sie haben derzeit die folgende Aufgabe, und Sie möchten, um eine Fortschrittsanzeige anzuzeigen, um Ihre Besucher.
PHP task.php
Die UI
Ihre schöne UI sieht wie folgt aus:
HTML ui.html
Der launcher
Wir müssen starten Sie den task im hintergrund, um diese demonstration relevant. Also, das php-Skript wird asynchron aufgerufen wird, wenn ein Klick auf "ausführen", und führen Sie die Aufgabe, die oben im hintergrund.
PHP task-launch.php
Probleme
Gibt es 3 Probleme:
können Sie den task ausführen, mehr als einmal, indem Sie mehrere Male auf die Schaltfläche ausführen, wie Sie vermeiden, mehrere Aufgaben im hintergrund zur gleichen Zeit?
die Aufgabe lief auf server-Seite, also müssen wir etwas tun, um den Zugriff auf den server und Fragen für die Weiterentwicklung Informationen.
und wenn wir angeschlossen werden, um die server-Seite, die
$progress
variable nicht verfügbar ist für das Lesen, weil es gespeichert ist, im Rahmen dertask.php
Laufenden Instanz.Lösungen
Speichern der Statusinformationen in etwas lesbares von außen
In der Regel, das Fortschreiten Informationen sind in einer Datenbank gespeichert oder eine Datei, oder was auch immer werden können writtable durch ein Programm (Ihre Aufgabe actaully), und lesbar durch eine andere (Ihre Benutzeroberfläche, in dem das Fortschreiten angezeigt werden soll).
Ich entwickelte eine Klasse für den Austausch von Daten in mehrere php-Anwendungen (verfügbar auf github hier), funktioniert es über den gleichen Weg wie
stdClass
aber immer sicher synchronisieren Sie den Inhalt in eine Datei.Einfach herunterladen
src/Sync.php
und ändern Sie die task.php oben:PHP task.php
Wichtiger Hinweis: hier
some_file.txt
ist, wo gespeichert sind, Sie Ihre Aufgabe, die gemeinsamen Daten, so zögern Sie nicht und nutzen "task_[user_id].txt" zum Beispiel, wenn jeder Benutzer hat seine eigene Aufgabe. Und Blick auf die readme auf github zu optimieren, den Zugriff auf Dateien.Verwenden, die synchronisiert variable zu schützen, die task launcher
PHP task-launch.php
PHP task.php
Warnung: wenn Ihre Aufgabe abstürzt und nie das Ende erreichen, werden Sie nie in der Lage sein, um es zu starten nicht mehr. Um solche Fälle zu vermeiden, können Sie auch speichern des Kindes
getmypid()
und einigetime()
Stoffe in Ihrem shared variable, und fügen Sie einen timeout-Logik in Ihre Aufgabe.Verwenden Sie polling, um den server auffordern, Fortschreiten Informationen
Polling steht für Fragen zur Versetzung von Informationen an den server jedes Zeitintervall (z.B. 1 Sek, 5 Sek oder was auch immer). In einem Wort, client fragt Statusinformationen an den server alle N Sekunden.
PHP task-follow.php
HTML ui-polling.html
Mit einem minimum an JavaScript ?
Ich entwickelte auch ein jquery-plugin, domajax, zu tun gedenke, "ajax ohne javascript" (in der Tat, das plugin selbst ist in jQuery, aber benutze es nicht benötigen JavaScript-code), und durch die Kombination von Optionen, die Sie tun können, abrufen.
In unserer Vorführung:
PHP task-follow.php
HTML ui-domajax.html
Wie Sie sehen können, gibt es keine sichtbaren javascript wird in diesem code. Sauber ist es nicht?
Andere Beispiele sind verfügbar auf domajax website, schauen Sie auf der "Verwalten Fortschrittsbalken leicht" Registerkarte in der demo-Bereich. Alle Optionen sind stark dokumentiert für details.
Alle, die Javascript ist wie 120kb der extra-code für den client herunterzuladen, sich in den Arbeitsspeicher laden und JIT-Kompilierung. Ein Grund für die Vermeidung von Javascript (die OPs Frage verlangt) ist nicht nur für Sauberkeit, sondern auch die Effizienz.
Du hast Recht, die Frage, die nötig ist, um das Fortschreiten ohne javascript; aber es enthielt auch Verwirrungen über output buffering und der global polling-Architektur. Meine Antwort ist allgemeiner und umfasst das Thema; es gibt eine (bessere) Möglichkeit, das zu tun polling. IMHO, im wirklichen Leben, javascript ist nur selten vermeiden, wenn Sie benötigen, um die Umfrage.
InformationsquelleAutor Alain Tiemblo
PHP ist eine server-side-Sprache und es gibt Sie Antwort, basierend auf Anfrage .
kann man nicht manipulieren (wie Sie wollen) auf DOM .
für diese sollten Sie verwenden, javascript und AJAX ändern von DOM-Elementen, basierend auf PHP Ergebnis
"PHP ist eine serverseitige Sprache ... man kann nicht nicht manipulieren (wie Sie wollen) auf DOM."
Nein. Sobald PHP gesendet hat, etwas auf dem browser, der ist es; es ist nicht möglich, für PHP zu ändern oder anderweitig zu modifizieren, was gesendet wurde.
Dies ist nicht immer wahr, PHP flush/ob_flush kann im wesentlichen anfügen an den DOM in einigen web-Servern. Überprüfen Sie heraus die Antwort, die ich gerade gebucht
(Ich bin eigentlich upvoting Ihre Antwort, nicht nur, weil es richtig ist, aber auch lassen Sie haben die seltene Umkehrung Abzeichen, offenbar Ihre erste gold! Herzlichen Glückwunsch 🙂 )
InformationsquelleAutor Anri
Du eigentlich nicht müssen Javascript, um dies zu erreichen. Wenn die Aufgabe, die Sie warten, ist hartnäckig, können Sie einfach erstellen Sie ein PHP-Skript, dass:
Können Sie eine nicht-javascript-refresh mit einem HTML-meta-refresh. Es könnte in etwa so Aussehen (noch nicht getan, PHP in 10 Jahren, so behandeln diese wie pseudocode):
Einen anderen Ansatz, eine wirklich hässlicher hack,, wäre die Verwendung von PHP flush () - Methode. Flush erzwingt die aktuelle Ausgabe Puffer auf das, was ist PHP läuft (CGI). Diese Ausgabe wird manchmal weiter puffert der host-Anwendung, sondern auf einem web-Server sendet die Ausgabe direkt an den Benutzer. Lesen Sie hier mehr: http://php.net/manual/en/function.flush.php
Müssen Sie möglicherweise kombinieren Sie es mit ob_flush, aber ich bin nicht positiv: http://php.net/manual/en/function.ob-flush.php
Mit CSS, man konnte alle ausblenden 'laden' text standardmäßig, aber überschreiben, die für den letzten-Kind-be-text und zeigt ihn statt. Zum Beispiel:
Beide Lösungen sind schrecklich, ich wollte nur zu teilen, für die Vollständigkeit 🙂
InformationsquelleAutor Jay Ty
Etwas näher auf die Antworten hier;
PHP ist eine serverseitige Sprache, aber das ist nicht der Grund, warum es nicht normalerweise Arbeit.
Dies hat zu tun mit der Art, wie wir kommunizieren über das HTTP-Protokoll.
Wenn ein client sendet eine HTTP-Anfrage an den server, das erste was passiert ist, dass Sie eine Verbindung herstellen. Der server verarbeitet die Anforderung und erzeugt eine Antwort, die dann zurück an den client gesendet.
Sobald die Antwort empfangen wird, wird die Verbindung stirbt.
So, in der Regel, erhalten Sie eine Antwort pro Anfrage.
Ein häufiges Missverständnis ist, dass mit der jetzt ausgefallenen
keep-alive
header für persistente verbindungen, Sie können halten Sie die Inhalte als der socket offen bleibt. HTTP hat nicht wirklich so funktioniert und würde verlangen, ein wenig mehr manipulation vor, können Sie streamen Sie Ihre Daten ein.Aber mehr auf, dass hier und hier.
Was können Sie tun?
Gibt es ein paar Optionen, die ich denken kann.
XMLHttpRequest
Objekte für die Abfrage der server basiert auf jede Antwort, die wir erhalten, effektiv erstellen einen Strom von Medien.Schließlich, möchten Sie vielleicht zu Lesen dieses beliebte Antwort das geht über einige dieser Technologien.
Was Sie sagen ist wahr, aber meine Antwort ist in Bezug auf die Frage, die Sie möglicherweise nicht sorgfältig gelesen habe. Sie haben mehrere Anfragen mit dem gleichen sockel, ja. Und das ist standardmäßig auch die, die ich festgestellt habe. Aber die dauerhafte Verbindung nur bedeutet, dass der client verwenden können, die gleichen zugrunde liegenden socket zum senden von mehreren Anfragen und empfangen der entsprechenden Antworten. Der server kann nicht einfach push - Daten zurück an den Kunden, es ist keine Kontrolle, es wird nur reagiert mehrmals auf mehrere Anfragen. Es ist nicht Einleitung hier.
NÖ. Der client stellt eine Anfrage. Antwortet der server und hält die Verbindung offen - drücken Sie einfach die Daten zurück an den client in Stücke schneiden. Dann wird die Verbindung geschlossen. Es reagiert nicht mehrere Male, um mehrere Anforderungen, sondern reagieren auch mehrfach eine Anfrage. Beispiel: stackoverflow.com/a/25203014/1163786 - ich die Frage genau Lesen: es enthält nicht ein Wort über die Anforderung von mehreren Anfragen. Wie auch immer, wir beide wissen, dass wir verwenden würden, JS-oder polling-tech.
Ich habe deine Antwort gelesen, aber es widerspricht nicht etwas in mir. Das einzige, was ich betonte, ist die Tatsache, dass HTTP ein request/response Protokoll. Auch in Ihrem Skript, während die Daten wieder in Blöcken, es ist nur noch one Antwort. War meine Antwort zu diesem Thema zu erarbeiten, wie ich eindeutig in Fett. Ähnliche Antwort hier
InformationsquelleAutor LifeQuery
Einfach:
So, die alten
<div>
s versteckt, als die neue erscheinen.Das wird nicht funktionieren, wenn Sie haben die response-buffering auf und nicht bündig nach jeder iteration. Aber auch, es misst nichts. Wohin Sie dieser, es ist im Prinzip sofort gehen Sie durch diese Zeilen. Auch mit der response-Puffer.
Guter Ausgangspunkt um die Reaktion Puffern. Auch ich war der Annahme, dass der Autor würde die "echo" - Anweisungen irgendwo anders, so dass ein tatsächlicher Wert gemessen werden sollte.
Ich sehe das, was Ihr zweiter Punkt ist hier, möchten Sie vielleicht, um die Reihenfolge der Codes zu simulieren, wie das wäre, anstelle der Verwendung einer Schleife. Auch, sicher sein, zu verwenden, ein @name, 'ping' mir, so sehe ich die Antwort; so: @jasonhansel
Sicher, dass es funktionieren würde. Aber du brauchst entweder
GOTO
oder verzögern und warten, bis etwas beendet ist - oder delay-eine weitere Runde. Mann, das wäre ein böse hack 🙂InformationsquelleAutor jasonhansel
Dieses Skript arbeitet mit PHP 5.4 und Nginx auf server-Seite und es ist mit Firefox getestet auf client-Seite. Es funktioniert nicht mit Google Chrome.
Demo bei YouTube über
Hinweise
InformationsquelleAutor Jens A. Koch
Ich weiß nicht, ob ich wirklich verstehe Ihre Frage, aber ich habe etwas in der Regel Menschen, die es nicht wissen. Um den Eindruck zu erwecken, dass die Zeile überschrieben wird, können Sie ein CR (Carriage Return "\r") vor der Ausgabe. Ich schrieb es auf ein Beispiel:
Läuft dies auf ein terminal bekomme ich einen coolen laden status:
$ php code.php
Hoffe, dass das, was Sie schon immer gesucht haben.
InformationsquelleAutor chaws
Nein, Sie können nicht dies tun, ohne die Hilfe von javascript oder jquery.
Können Sie eine php-Seite, wenn Sie brauchen, und dass die Rückkehr der Fortschritt wie unten
dann müssen Sie rufen es von Ihrer Seite mittels jquery
In der Frage, die er eindeutig erwähnt, dass Sie tun müssen, um diese mit Hilfe von php, wenn der Fortschritt wird immer von einem Datenbank-Wert als sicher, die Sie benötigen, um den Einsatz von php oder andere server-side-scripting. In diesem Fall, wie können Sie zeigen die Fortschritte, die nur mithilfe von HTML und CSS?
InformationsquelleAutor JSunny
Ich ein bisschen CSS und HTML, Das ist, was ich kam mit:
InformationsquelleAutor Nivedita
Müssen Sie zum aktualisieren der Seite mit javascript.
Können Sie entfernen Sie die sleep-Funktion und machen Ihre Arbeit dort.
InformationsquelleAutor stomo21
Eigentlich PHP nicht bieten eine solche Funktion.
Zeigen eine progress-bar, die Sie könnten versuchen, diese:
Während der Ausführung der lang-Datei-Generierung, speichern Sie eine Prozentsatz-getan-Wert in die aktuelle Sitzung des Benutzers
Auf der Seite, die zeigt das download-Formular, fügen Sie ein iFrame, welche Anrufe ein progress.php Skript
Den progress.php Skript zum generieren Webseite, die Bedürfnisse neu zu laden auto-magisch
Den progress.php Skript Lesen muss, den aktuellen progress-Wert aus der session aus und zeichnen Sie eine Fortschritt-bar-Grafiken, die visuell repräsentiert den Fortschritt.
Dies ist zwar eine PHP-only-Lösung, könnten Sie sich gut vorbereiten, ein anderes mit JS /AJAX.
Den HTML-auto-reload sollte wie diese:
http://linuxfreak.com/progress.php">
InformationsquelleAutor freakywebix
Nach dem Lesen alle Kommentare und Antworten, die sagen, dass dies nicht möglich ist, mit PHP, ich dachte, ich würde eine minute dauern, um zu beweisen, dass Sie falsch 😛
Empfehle ich nicht wirklich mit dieser (da gibt es sicherlich bessere Wege zum erreichen einer be-Statusanzeige), aber dieses "un-echo" der vorherigen Zeile, solange Sie nicht die zlib-Komprimierung in PHP aktiviert:
Da hast du Recht. Ein weiterer der endlosen Gründe, um nicht wirklich tun.
Koch: sleep() zählen in der php-Ausführungszeit? Ich denke nicht so. - NÖ, ist es sicher: php.net/manual/en/function.set-time-limit.php
Hmm. Interessant. Ich bin auf Windows und die sleep () - Zeit ist gezählt, als der Ausführung. Ich denke, Sie sind auf Linux, wo die Schlaf-Zeit wird ignoriert und nicht mitgezählt die in der Ausführung Zeit. Aber können Sie erklären, warum sleep() nicht zählen, die in der Ausführung Zeit auf Linux?
"Die set_time_limit () - Funktion und die Konfigurations-Direktive max_execution_time betreffen nur die Ausführungszeit des Skripts selbst. Jede Zeit, die auf Aktivität, die geschieht, außerhalb der Ausführung des Skripts wie Systemaufrufen mit system(), stream-Operationen, Datenbank-Abfragen, etc. ist nicht im Lieferumfang enthalten, bei der Bestimmung der maximalen Zeit, die das Skript ausgeführt wurde. Das ist nicht wahr, über Windows, wo die gemessene Zeit ist real." -http://php.net/manual/en/function.set-time-limit.php
InformationsquelleAutor aecend
Kann ich nicht sehen, die anderen Weg, dann versenden mehrerer Anfragen zu ein und demselben Skript und speichern Sie den Prozentsatz des Fortschritts in der Sitzung. Dies könnte eine Reine PHP-und HTML-Lösung.
Was denkst du ?
InformationsquelleAutor webNeat
Könnten Sie
ob_flush();
undflush();
Dieser Arbeit wird aber bewusst sein, dass Sie sollten geben Sie document Charset
und dann am Anfang von php hinzufügen
ob_start();
im loop kopieren Sie beideob_flush();
flush();
aber dieser druckt alle 1 bis 100 sollten Sie php print
Dies ist meine eigene Art und Weise.
InformationsquelleAutor UltraDEVV
So viel für so eine simple Frage. Wirklich, was Sie Fragen ist, wie stream-Ausgabe vom server, Wenn ich die Frage richtig, diese Funktion aufrufen.
Dann in der Schleife so etwas tun.
Ist der wichtige Teil ist hier zu nennen, Spülen, Wann immer Sie wollen, um eine Ausgabe generieren. Da für die änderung der DOM, schon mal gehört von einem IFRAME, führen Sie es einfach in einem iframe und Ihr alles gute. Iframes sind die Wurmlöcher des interwebs.
InformationsquelleAutor ArtisticPhoenix
dies funktioniert gut für mich
Screenshot:
die Sache über php ist, dass es wird vollständig geladen und angezeigt, als html-Inhalt.
(ich.e)
hier sind sowohl die echo-Anweisungen werden angezeigt, gleichzeitig aber die Ladezeit der Seite wird erweitert, wie Sie die Zeit verlängern, in usleep-Funktion.
so haben wir, um eine server-Anfrage jeder Zeit erhöhen wir den Wert im laden von Inhalten.
als u wissen bereits, dass dies getan werden könnte, mit javascript,jquery,ajax, habe ich versucht dies mit session.
hoffe, das ist praktisch...
InformationsquelleAutor Ronser
Nicht möglich nur mit PHP, aber es erreicht werden kann, mit PHP + JS, versuchen Sie folgenden Beispiel,
Hinweis: dies wird nicht funktionieren, wenn zlib.output_compression aktiviert ist oder einige antivirus-software hält den Puffer, bis die Seite fertig geladen, bevor Sie an den browser.
InformationsquelleAutor Dharmesh Patel
Lets sagen, die Seite hat einige große Daten zu laden, so dass Sie wollen, loader.
Können Sie die Benutzer denken, es ist eine loader.
Schön und glatt.
InformationsquelleAutor GramThanos
Es hängt wirklich davon ab, wie das mit dem laden, aber was Sie tun könnte, wenn Sie wirklich wollen, zu verwenden AJAX js zu halten, eine geöffnete Verbindung und auf jedes update von der Verarbeitung auf dem back-end zu update-der-front-end mit JS , aktualisiert die korrekte Anzeige widget/Feld in der AJAX Rückruf.
Wenn Sie nur wollen, es zu tun mit PHP könnte man einfach folgende:
InformationsquelleAutor ziGi
Nur um diese Frage, könnten Sie output buffering benutzen, wenn Sie wirklich wollen, dies zu erreichen (dies wird nicht empfohlen obwohl). Die einzige Einschränkung ist, dass können Sie nicht überschreiben Vorherige Ausgabe. Das ist mehr wie ein Fortschrittsbalken:
Sehen Display-Ausgabe in teilen in PHP.
Im wesentlichen, was Ihr code tut, ist nicht ausgegeben, nichts, bis 100% erreicht wurde oder noch subjectible, um die beschriebenen Probleme durch die OP.
Der obige code macht genau das Gegenteil, es bedeutet nicht warte bis 100% erreicht ist, es gibt den Fortschritt in Stücke schneiden. Das ist der springende Punkt ...
InformationsquelleAutor Ke Vin
Lösung, nicht das beste für die Entwickler, aber es werden arbeiten für das, was Sie wollen.
Du bist Skript ist ok.
Aber wenn man sich das Ergebnis auf alle, und Sie sehen nicht Fortschreiten, ist es, weil es ist ein Puffer-Mechanismus.
Vielleicht php, vielleicht web-server (apache,...) oder vielleicht sogar browser-Puffer.
Werfen Sie einen Blick auf die flush() php-Funktion.
Um zu testen, müssen Sie die Benutzer ein "command-line browser" (vielleicht telnet /GET manuelle Anforderung). Wenn die Befehlszeile zeigen Sie den Inhalt der nächsten Zeile nach Zeile, dann ist das problem mit Ihrem web-browser.
Aber zuerst, Sie brauchen, um zu identifizieren, WO ist der aktuelle Puffer-Mechanismus: php-Ausgabe? (siehe flush php-Funktion), web-server-Komprimierung ? (siehe gzip-Komprimierung) vielleicht browser-buffering ? (chrome wartet das Ende der Datei vor dem anzeigen der Ergebnisse)
InformationsquelleAutor user3918446