Heim >Backend-Entwicklung >PHP-Tutorial >Ausführliche Erläuterung der Verwendung des Ausgabecaches der ob-Serienfunktion

Ausführliche Erläuterung der Verwendung des Ausgabecaches der ob-Serienfunktion

伊谢尔伦
伊谢尔伦Original
2017-06-24 11:49:251517Durchsuche

ob, Ausgabepuffer, ist die Abkürzung für Ausgabepufferung, nicht für Ausgabecache. Wenn ob richtig verwendet wird, wird die Geschwindigkeit bis zu einem gewissen Grad verbessert, aber das blinde Hinzufügen der ob-Funktion erhöht nur die zusätzliche Belastung der CPU

Das Grundprinzip von ob: Wenn der ob-Cache aktiviert ist , die Echodaten werden zuerst gesendet. Legen Sie sie in den Ob-Cache. Wenn es sich um Header-Informationen handelt, werden diese direkt im Programmcache abgelegt. Wenn die Seite bis zum Ende ausgeführt wird, werden die zwischengespeicherten Ob-Daten im Programmcache abgelegt und dann wiederum an den Browser zurückgegeben.
Lassen Sie uns über die Grundfunktionen von ob sprechen:
1) Verhindern Sie die Verwendung von Funktionen wie setcookie(), header() oder session_start() zum Senden von Header-Dateien nach der Ausgabe durch den Browser Fehler. Tatsächlich ist es besser, diese Art der Verwendung seltener zu verwenden und gute Programmiergewohnheiten zu entwickeln.
2) Erfassen Sie die Ausgabe einiger nicht verfügbarer Funktionen. Zum Beispiel gibt phpinfo() eine Menge HTML aus, aber wir können derzeit keine Variable wie $info=phpinfo(); verwenden wird nützlich sein.
3) Verarbeiten Sie den Ausgabeinhalt, z. B. GZIP-Komprimierung, Konvertierung zwischen vereinfachtem und traditionellem Chinesisch und einige Zeichenfolgenersetzungen.
4) Beim Generieren statischer Dateien wird tatsächlich die Ausgabe der gesamten Seite erfasst und dann als Datei gespeichert. Wird häufig bei der HTML-Generierung oder beim Ganzseiten-Caching verwendet.

In Bezug auf die im dritten Punkt erwähnte GZIP-Komprimierung möchten viele Menschen sie möglicherweise verwenden, haben sie jedoch noch nicht verwendet. Tatsächlich können Sie durch geringfügige Änderung des Codes eine GZIP-Komprimierung der Seite erreichen .

ob_start(ob_gzhandler);
要缓存的内容

Ja, fügen Sie einfach eine Rückruffunktion ob_gzhandler hinzu, aber es gibt einige kleinere Probleme damit. Erstens ist Zlib-Unterstützung erforderlich, und zweitens wird nicht bestimmt, ob der Browser gzip unterstützt (. es scheint jetzt) ​​Sie werden alle unterstützt, und iPhone-Browser scheinen sie alle zu unterstützen).
Der vorherige Ansatz bestand darin, festzustellen, ob der Browser gzip unterstützt, dann die gzip-Funktion eines Drittanbieters zu verwenden, um den Inhalt von ob_get_contents() zu komprimieren, und schließlich zu echoen.

1. Sammlung häufig verwendeter Funktionen in der ob-Funktionsreihe

ob_start(); wird jedoch im Ausgabepuffer gespeichert.

ob_clean(); //Löschen Sie den Inhalt des internen Puffers, ohne den Puffer zu schließen (keine Ausgabe).
ob_end_clean(); //Löschen Sie den Inhalt des internen Puffers und schließen Sie den Puffer (keine Ausgabe).
ob_get_clean(); //Den Inhalt des internen Puffers zurückgeben und den Puffer schließen. Entspricht der Ausführung von ob_get_contents() und ob_end_clean()
ob_flush();                                                                  ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​sendet den Inhalt des Puffers und löscht den Inhalt des Puffers, ohne den Puffer zu schließen.
ob_end_flush(); //Sende den Inhalt des internen Puffers an den Browser, lösche den Inhalt des Puffers und schließe den Puffer.
ob_get_flush(); // Den Inhalt des internen Puffers zurückgeben, den Puffer schließen und dann den Inhalt des Puffers freigeben. Entspricht ob_end_flush() und gibt den Pufferinhalt zurück.
flush(); // Den von ob_flush freigegebenen Inhalt und den nicht im PHP-Puffer enthaltenen Inhalt an den Browser ausgeben und ihn ausgeben.

ob_get_contents(); //Den Inhalt des Puffers ohne Ausgabe zurückgeben.
ob_get_length(); //Gibt die Länge des internen Puffers zurück, wenn der Puffer nicht aktiviert ist.
ob_get_level(); //Die Verschachtelungsebene des Ausgabepuffermechanismus zurückgeben.
ob_get_status(); //Absolute Aktualisierung ein- oder ausschalten Die Standardeinstellung ist „Aus“. -Absolute Aktualisierung bedeutet, dass bei Ausführung einer Ausgabeanweisung (z. B. Echo) die Ausgabe direkt an den Browser gesendet wird und nicht mehr benötigt wird. Rufen Sie „flush()“ auf oder warten Sie bis zum Ende des Skripts, um es auszugeben.

ob_gzhandler //ob_start Rückruffunktion, verwendet gzip, um den Inhalt des Puffers zu komprimieren. ob_list_handlers

//Alle verwendeten Ausgabehandler auflisten


output_add_rewrite_var //URL-Rewriter-Werte hinzufügen
output_reset_rewrite_vars //URL-Rewriter-Werte zurücksetzen

这些函数的行为受php_ini设置的影响:
output_buffering       //该值为ON时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。
output_handler         //该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。
implicit_flush         //作用同ob_implicit_flush,默认为Off。

二、实例讲解

1、使 header() 函数前可以有echo代码
Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。
输出控制函数不对使用 header() 或 setcookie(),发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。  

ob_start();                   //打开缓冲区  
echo "Hello\n";               //输出  
header(“location:index.php”); //把浏览器重定向到index.php   
ob_end_flush();               //输出全部内容到浏览器

所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:"Header had all ready send by"!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!
2、保存 phpinfo() 函数的输出

ob_start();                      //打开缓冲区   
phpinfo();                       //使用phpinfo函数   
$info = ob_get_contents();       //得到缓冲区的内容并且赋值给$info   
$file = fopen('info.txt', 'w');  //打开文件info.txt   
fwrite($file, $info);            //写入信息到info.txt   
fclose($file);                   //关闭文件info.txt

3、静态模版技术
所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina、163、sohu。类似这种的技术带来的好处是非常巨大的。 

ob_start();                            //打开缓冲区
php页面的全部输出   
$content = ob_get_contents();          //取得php页面输出的全部内容   
$fp = fopen("output00001.html", "w");  //创建一个文件,并打开,准备写入   
fwrite($fp, $content);                 //把php页面的内容全部写入output00001.html,然后……   
fclose($fp);

三、输出缓存句柄ob_gzhandler
PHP4.0.4有一个新的输出缓存句柄ob_gzhandler,它与前面的类相似,但用法不同。使用ob_gzhandler时要在php.ini中加入的内容如下:  

output_handler = ob_gzhandler;

这行代码使得PHP激活输出缓存,并压缩它发送出去的所有内容。

如果由于某种原因你不想在php.ini中加上这行代码,你还可以通过PHP源文件所在目录的.htaccess文件改变默认的服务器行为(不压缩),语法如下:    

php_value output_handler ob_gzhandler

或者是从PHP代码调用,如下所示:

ob_start("ob_gzhandler");

采用输出缓存句柄的方法确实非常有效,而且不会给服务器带来什么特殊的负荷。但必须注意的是,Netscape Communicator对压缩图形的支持不佳,因此除非你能够保证所有用户都使用IE浏览器,否则你应该禁止压缩JPEG和GIF图形。一般地,对于所有其他文件,这种压缩都有效,但建议你针对各种浏览器都分别进行测试,特别是当你使用了特殊的插件或者数据查看器时这一点尤其重要。
注意事项:
1、一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为了确保flush有效,最好在ob_flush()函数前有以下语句:

print str_repeat("", 4096);  //以确保到达output_buffering值

2、ob_* 系列函数是操作PHP本身的输出缓冲区,所以ob_flush只刷新PHP自身的缓冲区,而flush是刷新apache的缓冲区。所以,正确使用俩者的顺序是:先ob_flush,然后flush。ob_flush是把数据从PHP的缓冲中释放出来,flush是把缓冲内/外的数据全部发送到浏览器。
3、不要误认为用了ob_start()后,脚本的echo/print等输出就永远不会显示在浏览器上了。因为PHP脚本运行结束后,会自动刷新缓冲区并输出内容。

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Verwendung des Ausgabecaches der ob-Serienfunktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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