Heim  >  Artikel  >  php教程  >  Detaillierte Erläuterung des PHP-Ausgabe-Caching

Detaillierte Erläuterung des PHP-Ausgabe-Caching

黄舟
黄舟Original
2016-12-14 13:13:581439Durchsuche

Die Ausgabesteuerungsfunktion hat keinen Einfluss auf die mit header() oder setcookie() gesendeten Datei-Header-Informationen, sondern nur auf Datenblöcke, die echo() und PHP-Code ähneln.
Nehmen wir zunächst ein einfaches Beispiel, um allen einen allgemeinen Eindruck von Output Control zu vermitteln:
Beispiel 1.

Der Code lautet wie folgt:


< ;?php
ob_start(); //Puffer öffnen
echo "Hellon"; //Ausgabe
header("location:index.php"); 🎜>ob_end_flush();//Alle Inhalte an den Browser ausgeben
?>

Jeder, der die Funktion header() kennt, weiß, dass diese Funktion einen Dateiheader an sendet Wenn jedoch vor der Verwendung dieser Funktion eine Ausgabe erfolgt (einschließlich leerer Ausgaben wie Leerzeichen, Wagenrückläufe und Zeilenvorschübe), wird ein Fehler angezeigt. Wenn wir ob_start() in der ersten Zeile entfernen und dann dieses Programm ausführen, erhalten wir eine Fehlermeldung: „Header had all ready send by“! Bei ob_start erfolgt jedoch keine Fehlermeldung. Der Grund dafür ist, dass die Zeichen nach dem Echo nicht an den Browser ausgegeben werden, sondern auf dem Server erhalten bleiben. Sie werden erst ausgegeben, wenn Sie Flush verwenden oder ob_end_flush, damit keine Datei-Header-Ausgabefehler auftreten!
1. Einführung in verwandte Funktionen:
1. Flush: Aktualisieren Sie den Inhalt des Puffers und geben Sie ihn aus.
Funktionsformat: Flush()
Beschreibung: Diese Funktion wird häufig verwendet und ist sehr effizient.
2. ob_start: Öffnen Sie den Ausgabepuffer
Funktionsformat: void ob_start(void)
Beschreibung: Wenn der Puffer aktiviert ist, werden alle Nicht-Datei-Header-Informationen vom PHP-Programm nicht gesendet, sondern gespeichert . im internen Puffer. Um den Inhalt des Puffers auszugeben, können Sie ob_end_flush() oder Flush() verwenden, um den Inhalt des Puffers auszugeben.
3. ob_get_contents: Gibt den Inhalt des internen Puffers zurück.
Verwendung: string ob_get_contents(void)
Beschreibung: Diese Funktion gibt den Inhalt des aktuellen Puffers zurück. Wenn der Ausgabepuffer nicht aktiviert ist, wird FALSE zurückgegeben.
4. ob_get_length: Gibt die Länge des internen Puffers zurück.
Verwendung: int ob_get_length(void)
Beschreibung: Diese Funktion gibt die Länge im aktuellen Puffer zurück, genau wie ob_get_contents, wenn der Ausgabepuffer nicht aktiviert ist. gibt dann FALSE zurück.
5. ob_end_flush: Senden Sie den Inhalt des internen Puffers an den Browser und schließen Sie den Ausgabepuffer.
Verwendung: void ob_end_flush(void)
Beschreibung: Diese Funktion sendet den Inhalt des Ausgabepuffers (falls vorhanden).
6. ob_end_clean: Löschen Sie den Inhalt des internen Puffers und schließen Sie den internen Puffer
Verwendungsmethode: void ob_end_clean(void)
Beschreibung: Diese Funktion gibt den Inhalt des internen Puffers nicht aus, sondern löscht ihn!
7. ob_implicit_flush: Absolute Aktualisierung ein- oder ausschalten
Verwendung: void ob_implicit_flush ([int flag])
Hinweis: Jeder, der Perl verwendet hat, kennt die Bedeutung von $|=x, diese Zeichenfolge kann umgewandelt werden on /Schließen Sie den Puffer, und die Funktion ob_implicit_flush ist die gleiche. Standardmäßig wird der Puffer geschlossen. Nach dem Einschalten der absoluten Ausgabe wird jede Skriptausgabe direkt an den Browser gesendet, und es ist nicht erforderlich, Flush() aufzurufen.
2. Detailliertes Verständnis:
Diese Funktion ist in PHP3 enthalten und verfügt über eine sehr nützliche Funktion zum Aktualisieren des Browser-Cache ein sehr offensichtlicher Operationseffekt. Beispiel zur Veranschaulichung von Flush.


Der Code lautet wie folgt:

for( $i = 1; $i < = 300; $i++ ) print(“ „); vom Browser ausgegeben werden

// Mit anderen Worten, wenn der Cache Wenn der Inhalt eine bestimmte Größe nicht erreicht, wird er nicht ausgegeben, bevor die Programmausführung abgeschlossen ist. Nach
// Tests habe ich festgestellt, dass die Untergrenze dieser Größe bei 256 Zeichen liegt. Dies bedeutet, dass der Inhalt, den der Cache in Zukunft empfängt,
// kontinuierlich gesendet wird.
For($j = 1; $j <= 20; $j++) {
echo $j.“
flush(); //Dies fügt etwas zum Cache hinzu Der Inhalt wird herausgedrückt und im Browser angezeigt
sleep(1); //Lassen Sie das Programm eine Sekunde lang „schlafen“, damit Sie den Effekt deutlicher sehen können
}
?>


Sie können hier gehen, um den spezifischen Effekt zu sehen: http://www.php2000.com/~uchinaboy/out.php
Der neueste PHP-Chatroom von PHP2000 verwendet diese Technologie. Leider ist der Quellcode not public L
Hinweis: Wenn Sie ob_implicit_flush() am Anfang des Programms hinzufügen, um die absolute Aktualisierung zu aktivieren, können Sie Flush() nicht mehr im Programm verwenden. Der Vorteil davon ist: Verbesserung der Effizienz!
2. Zu den Funktionen der ob-Serie:
Ich möchte zunächst ein Beispiel meines guten Freundes y10k zitieren:
Beispiel 3.
Zum Beispiel können Sie die Einstellungsinformationen des Servers verwenden und Was soll ich tun, wenn ich die Ausgabe der Funktion phpinfo() speichern möchte, da sie von Client zu Client unterschiedlich ist? Bevor es keine Pufferkontrolle gab, kann man sagen, dass es überhaupt keine Lösung gab, aber mit Pufferkontrolle können wir es leicht lösen:

Der Code lautet wie folgt:


< ;?php
ob_start(); //Öffne den Puffer
phpinfo(); //Verwende die phpinfo-Funktion
$info=ob_get_contents(); //Den Inhalt abrufen puffern und $info
$file=fopen('info.txt','w'); //Datei öffnen info.txt
fwrite($file,$info); //Informationen schreiben to info.txt
fclose ($file); //Schließe die Datei info.txt
?>


Mit der oben genannten Methode können Sie die PHPInfo-Informationen verschiedener Benutzer speichern. Dies war zuvor möglicherweise nicht möglich! Tatsächlich ist das Obige eine Methode, um einige „Prozesse“ in „Funktionen“ umzuwandeln!
Einige Leute fragen sich vielleicht: „Ist das einfach so? Gibt es noch andere Verwendungsmöglichkeiten? Wenn das Ergebnis direkt ausgegeben wird, kann es nicht bei jedem Aufruf gespeichert werden. Das Forum des Autors behält das von der Syntaxhervorhebungsfunktion angezeigte Ergebnis bei. Sie können einen Blick darauf werfen: http://www.zphp.com/bbs/!
Vielleicht haben Sie jetzt ein gewisses Verständnis für die Funktion von ob_start(). Das obige Beispiel scheint einfach, aber tatsächlich beherrschen Sie die wichtigsten Punkte der Verwendung von ob_start().
<1>. Verwenden Sie ob_start, um den Cache des Browsers zu öffnen. Dadurch wird sichergestellt, dass der Inhalt des Caches nicht ausgegeben wird, bevor Sie Flush(), ob_end_flush() aufrufen (oder das Programm ausgeführt wird).
<2> Jetzt sollten Sie die Vorteile kennen, die Sie haben: Sie können Header, Setcookie und Session nach jedem Ausgabeinhalt verwenden, was eine großartige Funktion von ob_start ist. Sie können auch die Parameter von ob_start im Cache verwenden geschrieben, wird der Befehl automatisch ausgeführt, z. B. ob_start("ob_gzhandler"); und unser gebräuchlichster Ansatz besteht darin, ob_get_contents() zu verwenden, um den Inhalt des Caches abzurufen und ihn dann zu verarbeiten ...
<3> Nach der Verarbeitung können wir verschiedene Methoden zur Ausgabe verwenden: Flush(), ob_end_flush() und die automatische Ausgabe nach der Ausführung des Programms. Wenn Sie ob_get_contents() verwenden, müssen Sie die Ausgabemethode natürlich selbst steuern.
Komm schon, mal sehen, was wir mit den Funktionen der ob-Serie machen können...
1. Statische Vorlagentechnologie
Einführung: Die sogenannte statische Vorlagentechnologie besteht darin, eine bestimmte Methode zu verwenden, um Benutzern dies zu ermöglichen Rufen Sie die von PHP generierte HTML-Seite auf. Wenn diese HTML-Seite nicht mehr aktualisiert wird, ruft das Programm PHP und zugehörige Datenbanken nicht mehr auf, wenn ein anderer Benutzer diese Seite erneut durchsucht. Für einige Websites mit einer großen Menge an Informationen, wie z. B. Sina, 163 und Sohu. Die Vorteile einer solchen Technologie sind enorm.
Ich kenne zwei Möglichkeiten, eine statische Ausgabe zu erreichen:
<1>. Implementiert durch eine Klasse namens template.inc.php von phplib, modifiziert durch y10k.
<2>. Verwenden Sie zur Implementierung ob-Serienfunktionen.
Da es sich bei der ersten Methode nicht um das Thema handelt, das in diesem Artikel untersucht werden soll, werde ich nicht näher darauf eingehen.
Werfen wir nun einen Blick auf die spezifische Implementierung der zweiten Methode:
Beispiel 4.
ob_start();//Öffnen Sie den Puffer
?> >Alle Ausgaben der PHP-Seite
$content = ob_get_contents();//Alle Inhaltsausgaben der PHP-Seite abrufen
$fp = fopen(“output00001.html”, “w ”); //Erstellen Sie eine Datei, öffnen Sie sie und bereiten Sie das Schreiben vor
fwrite($fp, $content); //Schreiben Sie den gesamten Inhalt der PHP-Seite in „output00001.html“ und dann...
fclose($fp);
?> Auf diese Weise kann die sogenannte statische Vorlage einfach implementiert werden...
Die obige Ausgabe ist das Im einfachsten Fall können Sie $content auch vor dem Schreiben bedienen...
Sie können versuchen, einige Schlüsselwörter zu erfassen und sie dann erneut zu verarbeiten, z. B. die in Beispiel 3 beschriebene PHP-Syntaxhervorhebung. Persönlich denke ich, dass diese Funktion der beste Teil dieser Funktion ist. Sie kann eine Vielzahl von Problemen lösen, erfordert jedoch genügend Vorstellungskraft ...
Beispiel 5.
If($code) {
eval($code); }else {
echo "Fehler! Keine Ausgabe";
exit();
}
return $contents; Sehr nützlich. Ein typischer $code selbst ist eine Ausgabeseite, die Variablen enthält. In diesem Beispiel wird eval verwendet, um die Variablen in $code zu ersetzen, und dann werden die Ausgabeergebnisse erneut erfasst und verarbeitet ...
Beispiel 6. Geschwindigkeit ​​Up-Übertragung
/*
** Titel.....: PHP4 HTTP-Komprimierung beschleunigt das Web
** Version.....: 1.20
** Autor....: catoc
** Dateiname......: gzdoc.php
** Letzte Änderung..: 18.10.2000
** Anforderungen...: PHP4 >= 4.0.1
** PHP wurde mit --with-zlib[=DIR] konfiguriert
** Hinweise..... ....: Dynamic Content Acceleration komprimiert
** die Datenübertragungsdaten im laufenden Betrieb
** Code von Sun Jin Hu (Catoc)
** wurde für die Unterstützung des HTTP 1.1
**-Standards ausgestattet, der als „Content-Encoding“ bekannt ist. Im Wesentlichen zeigt der Browser dies an** Server, dass er „Content Encoding“ akzeptieren kann 
** und wenn der Server dazu in der Lage ist, wird er dann 
** die Daten komprimieren und übertragen. Der 
** Browser dekomprimiert es und rendert dann 
** die Seite. 
** 
** Geändert von John Lim (jlim@natsoft.com.my) 
** basierend auf Ideen von Sandy McArthur, Jr. 
** Verwendung........ : 
** Kein Leerzeichen vor dem Anfang des ersten „** ------------Anfang der Datei---------- 
** |** | include('gzdoc.php'); 
** |? > 
** | 
** |... die Seite ... 
** | 
** |** | gzdocout(); 
** |? > 
** -------------Ende der Datei----------- 
*/ 
ob_start(); 
ob_implicit_flush(0); 
function CheckCanGzip(){ 
global $HTTP_ACCEPT_ENCODING; 
if (headers_sent() || Connection_timeout() || Connection_aborted()){ 
return 0; 

if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false) return "x-gzip"; 
if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return "gzip"; 
Rückgabe 0; 

/* $level = Komprimierungsstufe 0-9, 0=keine, 9=max */ 
function GzDocOut($level=1,$debug=0){ 
$ENCODING = CheckCanGzip(); 
if ($ENCODING){ 
print "nn"; 
$Contents = ob_get_contents(); 
ob_end_clean(); 
if ($debug){ 
$s = "

Länge nicht komprimieren: ".strlen($Contents); 
$s .= " 
Komprimierte Länge: ".strlen(gzcompress($Contents,$level)); 
$Contents .= $s; 

header("Content-Encoding: $ENCODING"); 
Drucken Sie „x1fx8bx08x00x00x00x00x00“; 
$Size = strlen($Contents); 
$Crc = crc32($Contents); 
$Contents = gzcompress($Contents,$level); 
$Contents = substr($Contents, 0, strlen($Contents) - 4); 
$Contents drucken; 
print pack('V',$Crc); 
print pack('V',$Size); 
Ausgang; 
}else{ 
ob_end_flush(); 
Ausgang; 


?> 
这是catoc的一段很早以前的代码, 是在weblogs.com看到的, 他利用了zlib的函数, 对传输的内容进行了压缩,测试表明,对于10k以上的页面,会产生效果,而且页面越大,效果越明显……

想要获取更多的相关内容请关注PHP中文网(www.php.cn)!

Stellungnahme:
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