Methoden ob_start und ob_flush funktioniert nicht, warum?
Ich bin mit ob_start()
/ob_flush()
, hoffentlich geben Sie mir einige Fortschritte während einer langen import-operation.
Hier ist eine einfache Zusammenfassung von dem, was ich Tue:
<?php
ob_start ();
echo "Connecting to download Inventory file.<br>";
$conn = ftp_connect($ftp_site) or die("Could not connect");
echo "Logging into site download Inventory file.<br>";
ftp_login($conn,$ftp_username,$ftp_password) or die("Bad login credentials for ". $ftp_site);
echo "Changing directory on download Inventory file.<br>";
ftp_chdir($conn,"INV") or die("could not change directory to INV");
// connection, local, remote, type, resume
$localname = "INV"."_".date("m")."_".date('d').".csv";
echo "Downloading Inventory file to:".$localname."<br>";
ob_flush();
flush();
sleep(5);
if (ftp_get($conn,$localname,"INV.csv",FTP_ASCII))
{
echo "New Inventory File Downloaded<br>";
$datapath = $localname;
ftp_close($conn);
} else {
ftp_close($conn);
die("There was a problem downloading the Inventory file.");
}
ob_flush();
flush();
sleep(5);
$csvfile = fopen($datapath, "r"); //open csv file
$x = 1;
//skip the header line
$line = fgetcsv($csvfile);
$y = (feof($csvfile) ? 2 : 5);
while ((!$debug) ? (!feof($csvfile)) : $x <= $y) {
$x++;
$line = fgetcsv($csvfile);
//do a lot of import stuff here with $line
ob_flush();
flush();
sleep(1);
}
fclose($csvfile); //important: close the file
ob_end_clean();
Jedoch wird nichts auf dem Bildschirm ausgegeben an alle.
Ich weiß, die Daten-Datei wird immer heruntergeladen, weil ich beobachte das Verzeichnis, in dem es platziert wird.
Weiß ich auch, dass der import ist passiert, was bedeutet, dass es in der while-Schleife, weil ich beobachten können, der DB und Datensätze eingefügt werden.
Irgendwelche Ideen, warum ich bin nicht immer auf dem Bildschirm ausgegeben?
- Warum sind Sie mit output-buffering, wenn Sie ausdrücklich nicht wollen, um buffer-Ausgang und senden Sie es als die Seite verarbeitet wird?
- Was meinst du? Ich möchte die Ausgabe der Sachen, wie es verarbeitet wird. Ist nicht das, was ich gesagt habe?
- Output buffering ist für genau das Gegenteil, d.h. die Pufferung der Ausgabe und senden Sie alle auf einmal. Warum verwendest du es?
- Ich war auf der Suche nach einem Weg zu senden, den Puffer BEI der Verarbeitung, anstatt zu warten, bis das gesamte Skript verarbeitet, wie PHP in der Regel nicht. Das wäre wie eine Art von Fortschritt-system. Darunter ob_flush() ausgeben soll, den Puffer auf das display sofort .vs warten, das Skript zu beenden. Sollte die Arbeit der Art wie dieses: drsoft.com/b/Your_very_own_PHP_progress_bar-73
- "anstatt zu warten, bis das gesamte Skript verarbeitet, wie PHP in der Regel bedeutet" Eigentlich ist dies nicht, wie PHP funktioniert in der Regel. Output buffering, da @Matti sagte, wie man mit PHP auf diese Weise zu handeln. Wenn es sich schon handeln, dass der Weg für Sie ist, dann ist es, weil der webserver zu tun, Ihre eigenen buffering/Zwischenspeichern.
- Haben Sie dieses Skript ausführen mit error-reporting eingeschaltet?
- Ja, das error reporting ist auf und das script läuft derzeit auf meinem dev-server (localhost), so dass die Pufferung ist nicht ein Problem.
InformationsquelleAutor MB34 | 2010-05-14
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie auch überprüfen Sie die PHP-Einstellungen
einige installiert standardmäßig 4096, einige default auf off
vereinbart mit George aber tun, überprüfen Sie den obigen Einstellungen
Stellen Sie sicher, dass Ihre Ausgabe-Pufferung nicht automatisch starten. Ausführung:
vor ob_start (); wenn Sie sehen, etwas anderes dann 0 hast du die Antwort.
Hey Mann, ich war auch stecken in diesem problem
und endlich die richtige Lösung
hier ist es für Sie
haben Sie die Möglichkeit, Inhalte hinzuzufügen, geben Sie für Ihre Seite
Sie können tun, dass durch die zwei Möglichkeiten
1. die Verwendung von html-Tags
Ex.
mit der php-header-Funktion
<?php header( 'Content-type: text/html; charset=utf-8' ); ?>
Ex.
Alle die besten
Ob_end_clean() löscht den Inhalt der aktuellen Ausgabe-Puffer und deaktiviert die Pufferung.
Sie verwenden sollten, ob_end_flush() statt.
ob_flush()
im gesamten Skript an, obwohlFügen Sie diese Zeile
arbeitete für mich.
Es ist möglich, dass Ihr webserver eigene Pufferung. Wahrscheinlich mit so etwas wie mod_gzip.
Hier sind einige sehr einfache test-code:
Wenn es dauert 10 Sekunden, die Seite zu laden, anstatt eine neue Zeile alle 2 Sekunden, dann bedeutet es, dass es zwischengespeichert wird von Ihrem webserver. Für das, was Sie zu tun versuchen, gibt es keine Notwendigkeit zu verwenden mit ob_start und ob_flush. Rufen Sie einfach
flush
Wann immer Sie wollen, zu zwingen, die Inhalte an den browser. Jedoch, wie ich bereits erwähnte, wenn der webserver wartet der Inhalte abgeschlossen ist, bevor Sie senden, das wird nicht etwas für Sie tun.Bearbeiten: eine Andere Möglichkeit ist, dass Sie die Seite anzeigen, von der hinter einer Firmen-oder ISP-proxy/firewall, das wartet, bis Sie die ganze Seite vor dem servieren (damit Sie Scannen können, um zu sehen, wenn es aussieht wie Pornografie, zum Beispiel).