Heim > Backend-Entwicklung > PHP-Tutorial > PHP gibt Daten Zeile für Zeile aus und löst zwei häufige Pufferprobleme

PHP gibt Daten Zeile für Zeile aus und löst zwei häufige Pufferprobleme

WBOY
Freigeben: 2016-08-08 09:30:30
Original
890 Leute haben es durchsucht

Der Blogger ist an verschiedenen Internet-Technologien interessiert. Er ist oft wortreich und wird oft von Zwangsstörungen begleitet. Wenn Sie denken, dass der Artikel für Sie hilfreich ist folgen Sie mir. Bitte geben Sie „Dark Blue Scythe“ an


1. Es sind Probleme aufgetreten

Ich frage mich, ob Sie welche haben Diese beiden Situationen sind mir noch nie begegnet:

  1. Der Chef möchte, dass Sie alle Daten in der Datenbank im Browser anzeigen, weil die Daten sein müssen Im Vergleich dazu ist die Anforderung des Chefs, dass Paging nicht verwendet werden kann , also ist es kein Problem, 1.000 Daten auszugeben und sie direkt in einer Schleife zu drucken, aber was ist, wenn es Millionen von Daten gibt? Wenn Sie Ihren Sitzplatz verlassen, eine Tasse Kaffee trinken, auf die Toilette gehen und lange mit der Empfangsdame chatten, stellen Sie fest, dass der Browser „Programm reagiert nicht“ anzeigt. Was sollten Sie tun?
  2. Der Chef hat Sie gebeten, den Download-Link der Website zu verbessern, sodass Sie zum Herunterladen der Datei direkt mit der linken Maustaste klicken müssen (bei einigen Dateitypen Wenn Sie direkt mit der linken Maustaste klicken, werden Sie auf vielen Websites aufgefordert, „mit der rechten Maustaste zu klicken und zu speichern unter“. Sie haben die Funktion Header und die Funktion Datei lesen verwendet Nachdem Sie jedoch online gegangen sind, haben Sie festgestellt, dass der Browser immer noch hängen bleibt, wenn die Datei zu groß ist. Ihr Chef möchte Ihnen dieses Mal Kaffee kaufen. Was sollten Sie tun?

Wenn Sie auf die beiden oben genannten Situationen stoßen oder in Zukunft möglicherweise auf ein solches Problem stoßen, können Sie es markieren, damit es beim nächsten Mal schnell gelöst werden kann.

2. Prinzip

Auf den Punkt kommen.

Das Folgende ist eine großartige Einführung der PHP-Ausgabesteuerung Ausgabepuffer

Versuchen Sie zunächst den Effekt des folgenden Codes

<?php
if (ob_get_level() == 0){ ob_start() }else{ exit(0);};//开始缓冲

for ($i = 0; $i<10; $i++){
    echo "Line to show.\n<br />";//不直接输出,先存入缓冲区中
    ob_flush();//将缓冲区的数据输出出来
    flush();//将缓冲区的数据输出出来
    sleep(2);//暂停两秒
}

echo "Done.";

ob_end_flush();//关闭并清理缓冲区
Nach dem Login kopieren

Ich hatte nicht erwartet, dass PHP dies auch faul implementieren kann Ladefunktion, Ist das nicht ein ganz tolles Gefühl?

Das Prinzip besteht darin, dass PHP die Daten in den Puffer (Puffer) legt. Bei Bedarf geben wir die gepufferten Daten aus Verwechselt mit Cache.

Der Vorteil hiervon ist, dass dadurch einerseits ein cooler Effekt ähnlich einem verzögerten Laden erzielt werden kann, andererseits aber auch der Druck auf Server und Client verringert werden kann Andernfalls ist bei der Ausgabe großer Datenmengen nicht genügend Speicher vorhanden.

Hinweis: ob_flush() und flush() werden zum Leeren von Pufferdaten verwendet, offizielle Empfehlungen verwenden jedoch zusammen, denn obwohl Sie unter den meisten Webservern den Puffer nur mit ob_flush() leeren können, funktioniert in einigen Fällen, wie zum Beispiel bei Apache, manchmal der Aufruf von flush() , daher wird für die Portabilität Ihres Codes empfohlen, flush() unmittelbar nach ob_flush() hinzuzufügen.

Da wir nun das Prinzip kennen, lösen wir die beiden eingangs genannten Probleme.

3. Lösen Sie das Problem der steckengebliebenen Ausgabe von Millionen von Daten auf einer einzigen Seite

<?php
ob_start();
$data = [1,2,3,4,5,6,7,8,9,10];//实际数据更多,为方便距离假设浏览器一次输出10条会卡死
$per = 3;//每次输出3条,可以改成1000 

for ($i = 0;$i < count($data); $i+= $per){
    for($j = $i; $j < $i + $per && $j <count($data); $j++){
        echo $data[$j];
    }
    ob_flush();
    flush();
    sleep(2);
}

echo "Done.";

ob_end_flush();

Nach dem Login kopieren

4 .Lösen Sie das Problem des Hängenbleibens, wenn die Header-Datei zu groß zum Herunterladen ist

<?php
header('Content-type: application/txt');//输出类型
ob_start();

$data = "qwertyuioasdfghjkl";//文件内容,file_get_contents($file)
$per = 15;//每次输出15个字符,可以改成1000或更大 


for ($i = 0;$i < strlen($data); $i+= $per){
    for($j = $i; $j < $i + $per && $j <strlen($data); $j++){
        echo $data[$j];
    }
    sleep(2);
    ob_flush();
    flush();
}


echo "Done."; 
    
ob_end_flush(); 
Nach dem Login kopieren

Das Obige führt PHP in die zeilenweise Ausgabe von Daten ein und löst zwei häufige Pufferprobleme. Ich hoffe, dass es für Freunde, die sich für PHP-Tutorials interessieren, hilfreich sein wird.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage