PHP ob_start()関数の要点を詳しく解説

WBOY
リリース: 2016-06-20 13:01:54
オリジナル
982 人が閲覧しました

通常、ブラウザのキャッシュを制御するには 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. 関連関数の紹介:
1. フラッシュ: バッファーの内容を更新して出力します。
関数の形式: flash()
説明: この関数は頻繁に使用され、非常に効率的です。
2. ob_start: 出力バッファを開きます
関数形式: void ob_start(void)
説明: バッファがアクティブ化されると、PHP プログラムからのファイル以外のヘッダー情報はすべて送信されませんが、保存されます。 .内部バッファ内。バッファの内容を出力するには、ob_end_flush() または flash() を使用してバッファの内容を出力します。
3. ob_get_contents: 内部バッファの内容を返します。
使用法: string ob_get_contents(void)
説明: この関数は、現在のバッファーの内容を返します。出力バッファーがアクティブ化されていない場合は、FALSE を返します。
4. ob_get_length: 内部バッファの長さを返します。
使用法: int ob_get_length(void)
説明: この関数は、出力バッファーがアクティブ化されていない場合、現在のバッファー内の長さを ob_get_contents と同じように返します。その後、FALSE を返します。
5. ob_end_flush: 内部バッファの内容をブラウザに送信し、出力バッファを閉じます。
使用法: void ob_end_flush(void)
説明: この関数は、出力バッファーの内容 (存在する場合) を送信します。
6. ob_end_clean: 内部バッファの内容を削除し、内部バッファを閉じる
使用方法: void ob_end_clean(void)
説明: この関数は内部バッファの内容を出力せずに削除します。
7. ob_implicit_flush: 絶対リフレッシュをオンまたはオフにします。
使用方法: void ob_implicit_flush ([int flag])

注: Perl を使用したことがある人なら、$|=x の意味を知っています。文字列はバッファをオープン/クローズすることができ、ob_implicit_flush 関数はデフォルトでバッファをクローズすることになっており、各スクリプト出力はブラウザに直接送信されます。 call flash()

2. 詳細な理解:

1. Flush 関数について:
この関数は、PHP3 で登場した非常に便利な関数です。ブラウザのキャッシュを更新する例を見てみましょう。フラッシュを説明するための非常に明らかな実行効果の例を示します。

例 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>
ログイン後にコピー
注: プログラムの先頭に ob_implicit_flush () を追加すると、プログラム内でフラッシュ() を使用できなくなります。これによる利点は次のとおりです。効率が向上します。

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>
ログイン後にコピー
上記の方法を使用すると、さまざまなユーザーの phpinfo 情報を保存できます。これは以前は不可能だったかもしれません。実は上記は一部の「処理」を「関数」に変換する方法なのです!

或许有人会问:"难道就这个样子吗?还有没有其他用途?"当然有了,比如笔者论坛的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>
ログイン後にコピー

这样,所谓的静态模版就很容易的被实现了


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!