ホームページ  >  記事  >  バックエンド開発  >  obシリーズ関数の出力キャッシュの使用方法の詳細な説明

obシリーズ関数の出力キャッシュの使用方法の詳細な説明

伊谢尔伦
伊谢尔伦オリジナル
2017-06-24 11:49:251502ブラウズ

ob、出力バッファーは、出力キャッシュではなく、出力バッファリングの略語です。 ob を正しく使用すると、ある程度速度が向上しますが、やみくもに ob 関数を追加すると、CPU への余分な負担が増えるだけです。ob キャッシュがオンになっていると、エコー データが保存されます。最初に ob キャッシュに配置されます。ヘッダー情報の場合は、プログラム キャッシュに直接配置されます。ページが最後まで実行されると、ob キャッシュされたデータがプログラム キャッシュに配置され、順番にブラウザに返されます。

ob の基本的な機能について話しましょう:
1) setcookie()、header()、または session_start() などの関数を使用して、ブラウザーが出力した後にヘッダー ファイルを送信することによって引き起こされるエラーを防ぎます。実際、この種の使用頻度を減らし、適切なコーディング習慣を身に付ける方が良いでしょう。
2) 取得できない関数の出力をキャプチャします。たとえば、phpinfo() は大量の HTML を出力しますが、この時点では、ob は $info=phpinfo(); のような変数を使用できません。役に立つ。
3) gzip 圧縮、簡体字中国語と繁体字中国語間の変換、一部の文字列置換などの出力コンテンツを処理します。
4) 静的ファイルの生成では、実際にはページ全体の出力をキャプチャし、それをファイルとして保存します。 HTML 生成またはページ全体のキャッシュでよく使用されます。

先ほどの 3 番目の GZIP 圧縮については、使いたいと思っていても実際に使ったことがない人も多いかもしれませんが、実はコードを少し変更するだけで、ページの gzip 圧縮を実現できます。

ob_start(ob_gzhandler);
要缓存的内容

はい、コールバック関数 ob_gzhandler を追加するだけですが、これにはいくつかの小さな問題があります。第一に、これには zlib サポートが必要であり、第二に、ブラウザが gzip をサポートしているかどうかが判断されません (現在はサポートされているようです)。 iPhoneのブラウザは対応しているようです)対応)。

以前のアプローチは、ブラウザが gzip をサポートしているかどうかを判断し、サードパーティの gzip 関数を使用して

ob_g​​et_contents
() のコンテンツを圧縮し、最後にエコーするというものでした。

1. ob シリーズの関数でよく使用される関数のコレクション

ob_start(); //出力バッファーを開きます。すべての出力情報はブラウザーに直接送信されなくなり、出力バッファーに保存されます。 。

ob_clean(); //バッファを閉じずに内部バッファの内容を削除します(出力なし)。

ob_end_clean(); //内部バッファの内容を削除し、バッファを閉じます(出力なし)。

ob_g​​et_clean(); //内部バッファの内容を返し、バッファを閉じます。 ob_get_contents() および ob_end_clean() の実行と同等
ob_flush(); // 内部バッファの内容をブラウザに送信し、バッファの内容を削除し、バッファを閉じません。
ob_end_flush(); //内部バッファの内容をブラウザに送信し、バッファの内容を削除して、バッファを閉じます。
ob_g​​et_flush(); //内部バッファの内容を返し、バッファを閉じてから、バッファの内容を解放します。 ob_end_flush() と同等で、バッファの内容を返します。
flush(); //ob_flush で解放した内容と PHP バッファにない内容をブラウザに出力し、内部バッファの内容を更新して出力します。

ob_g​​et_contents(); // 出力せずにバッファーの内容を返します。

ob_g​​et_length
(); // 内部バッファーがアクティブ化されていない場合、この関数は FALSE を返します。 ob_g​​et_level(); //出力バッファリングメカニズムのネストレベルを返します。ob_g​​et_status(); ob_implicit_flush(true) を開いた後、いわゆる絶対リフレッシュは、出力ステートメント (例: echo) が実行されることを意味します。出力はブラウザに直接送信され、flush() を呼び出したり、スクリプトの終了まで待ったりする必要はありません。

ob_g​​zhandler //ob_start コールバック関数は、gzip を使用してバッファーの内容を圧縮します。

ob_list_handlers //

这些函数的行为受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脚本运行结束后,会自动刷新缓冲区并输出内容。

以上がobシリーズ関数の出力キャッシュの使用方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。