通常、ブラウザのキャッシュを制御するには PHP の ob_start() を使用します。出力制御関数を使用すると、スクリプト内のデータの出力を自由に制御できます。特にデータ出力後にファイルヘッダーを出力したい場合に非常に便利です。
出力制御関数は、header() または setcookie() を使用して送信されるファイル ヘッダー情報には影響しませんが、echo() や PHP コードと同様のデータ ブロックにのみ影響します。
出力制御の一般的な印象を与える簡単な例を示します。
<p><?php</p>ob_start(); //打开缓冲区<br />echo 'Hellon'; //输出<br />header('location:index.php'); //把浏览器重定向到index.php<br />ob_end_flush();//输出全部内容到浏览器<br /><p>?></p>
All header( ) 関数は、この関数がファイル ヘッダーをブラウザに送信することを認識していますが、この関数を使用する前に出力 (スペース、キャリッジ リターン、ライン フィードなどの空の出力を含む) がある場合は、エラーが表示されます。最初の行の ob_start() を削除してこのプログラムを実行すると、次のエラー メッセージが表示されることがわかります。「ヘッダーはすべて送信準備ができました。」ただし、ob_start を使用すると、エラー メッセージは表示されません。その理由は、バッファーが開かれたときに、echo 以降の文字がブラウザーに出力されず、flush を使用するまでサーバー上に出力されないためです。または ob_end_flush なので、ファイル ヘッダー出力エラーは発生しません。
1. 関連関数の紹介:注: Perl を使用したことがある人なら、$|=x の意味を知っています。文字列はバッファをオープン/クローズすることができ、ob_implicit_flush 関数はデフォルトでバッファをクローズすることになっており、各スクリプト出力はブラウザに直接送信されます。 call flash()
2. 詳細な理解:
1. Flush 関数について:例 2.
<p><?php</p>for($i=1; $i<=300; $i++ ) print(' ');<br /> // 这一句话非常关键,cache的结构使得它的内容只有达到一定的大小才能从浏览器里输出<br /> // 换言之,如果cache的内容不达到一定的大小,它是不会在程序执行完毕前输出的。经<br /> // 过测试,我发现这个大小的底限是256个字符长。这意味着cache以后接收的内容都会<br /> // 源源不断的被发送出去。<br /> For($j=1; $j<=20; $j++) {<br /> echo $j." ";<br /> flush(); //这一部会使cache新增的内容被挤出去,显示到浏览器上<br /> sleep(1); //让程序"睡"一秒钟,会让你把效果看得更清楚<br />}<br /><p>?></p>
2. ob シリーズの機能について:
サーバーとクライアントの設定情報を使用しますが、この情報はクライアントによって異なります。その出力を保存したい場合はどうすればよいですか? phpinfo()関数?バッファ制御がなかった前はまったく方法がなかったと言えますが、バッファ制御を使用すると、それを簡単に解決できます。最初に私の友人 y10k の例を引用したいと思います。。例 3.<p><?php</p>ob_start(); //打开缓冲区<br />phpinfo(); //使用phpinfo函数<br />$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info<br />$file=fopen('info.txt','w'); //打开文件info.txt<br />fwrite($file,$info); //写入信息到info.txt<br />fclose($file); //关闭文件info.txt<br /><p>?></p>
或许有人会问:"难道就这个样子吗?还有没有其他用途?"当然有了,比如笔者论坛的PHP 语法加亮显示就和这个有关(PHP默认的语法加亮显示函数会直接输出,不能保存结果,如果在每次调用都显示恐怕会很浪费CPU,笔者的论坛就把语法加亮函数显示的结果用控制缓冲区的方法保留了),大家如果感兴趣的话可以来看看
可能现在大家对ob_start()的功能有了一定的了解,上面的一个例子看似简单,但实际上已经掌握了使用ob_start()的要点。
<1>.使用ob_start打开browser的cache,这样可以保证cache的内容在你调用flush(),ob_end_flush()(或程序执行完毕)之前不会被输出。
<2>.现在的你应该知道你所拥有的优势:可以在任何输出内容后面使用header,setcookie以及session,这是 ob_start一个很大的特点;也可以使用ob_start的参数,在cache被写入后,然后自动运行命令,比如ob_start(\ "ob_gzhandler\");而我们最常用的做法是用ob_get_contents()得到cache中的内容,然后再进行处理……
<3>.当处理完毕后,我们可以使用各种方法输出,flush(),ob_end_flush(),以及等到程序执行完毕后的自动输出。当然,如果你用的是ob_get_contents(),那么就要你自己控制输出方式了。三、让我们看看能用ob系列函数做些什么……一、 静态模版技术
简介:所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina,163,sohu。类似这种的技术带来的好处是非常巨大的。
我所知道的实现静态输出的有两种办法:
<1>.通过y10k修改的phplib的一个叫template.inc.php类实现。
<2>.使用ob系列函数实现。
对于第一种方法,因为不是这篇文章所要研究的问题,所以不再赘述。
我们现在来看一看第二种方法的具体实现:
<p><?php</p>ob_start();//打开缓冲区<br />$content=ob_get_contents();//取得php页面输出的全部内容<br />$fp=fopen("output00001.html", "w"); //创建一个文件,并打开,准备写入<br />fwrite($fp, $content); //把php页面的内容全部写入output00001.html,然后……<br />fclose($fp);<br /><p>?></p>
这样,所谓的静态模版就很容易的被实现了