PHP での Ob_start 使用状況分析

不言
リリース: 2023-04-02 12:18:02
オリジナル
1879 人が閲覧しました

この記事では、主に PHP の ob_start の使用状況分析を紹介します。この記事は、一定の参考値があります。今、皆さんに共有します。必要な友人は、それを参照してください。

PHP の ob_start();
ブラウザキャッシュの制御

出力制御 関数を使用すると、スクリプト内のデータの出力を自由に制御できます。特にデータ出力後にファイルヘッダーを出力したい場合に非常に便利です。出力制御機能は使用しません header() または setcookie() の場合、送信されるファイル ヘッダー情報は影響を及ぼしますが、echo() や PHP コードと同様のデータ ブロックにのみ影響します。
出力制御の一般的な印象を皆さんに伝えるために、まず簡単な例を示します。
例 1.

プログラム コードプログラム コード

<?php
ob_start(); //打开缓冲区
echo \"Hellon\"; //输出
header("location:index.php"); //把浏览器重定向到index.php
ob_end_flush();//输出全部内容到浏览器
?>
ログイン後にコピー

すべてのペアheader() 関数は、この関数がファイル ヘッダーをブラウザに送信することを認識していますが、この関数を使用する前に出力 (スペース、キャリッジ リターン、ライン フィードなどの空の出力を含む) がある場合は、「問題が発生しました」というプロンプトが表示されます。 。最初の行の ob_start() を削除してこのプログラムを実行すると、次のエラー メッセージが表示されることがわかります。 すべて送る準備ができていました by"! ただし、ob_start を追加してもエラーは表示されません。その理由は、バッファーが開かれたときに、echo の後の文字がブラウザーに出力されず、ユーザーが使用するまでサーバー上に保持されるためです。 flash または 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 の意味を知っており、この文字列は/Close をオンにすると、ob_implicit_flush 関数はそれと同じです。デフォルトではバッファを閉じます。絶対出力をオンにした後、各スクリプト出力はブラウザに直接送信され、flush を呼び出す必要はありません。 ()

2. 深い理解:

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

プログラム コードプログラム コード

<?php
for($i = 1; $i <= 300; $i++ ) print(" ");
// 这一句话非常关键,cache的结构使得它的内容只有达到一定的大小才能从浏览器里输出
// 换言之,如果cache的内容不达到一定的大小,它是不会在程序执行完毕前输出的。经
// 过测试,我发现这个大小的底限是256个字符长。这意味着cache以后接收的内容都会
// 源源不断的被发送出去。
For($j = 1; $j <= 20; $j++) {
echo $j."
";
flush(); //这一部会使cache新增的内容被挤出去,显示到浏览器上
sleep(1); //让程序"睡"一秒钟,会让你把效果看得更清楚
}
?>
ログイン後にコピー

注:プログラムの先頭に ob_implicit_flush() を追加して絶対値をオンにします リフレッシュすると、プログラム内でフラッシュ() を使用できなくなります。これによる利点は次のとおりです: 効率が向上します。

2. ob シリーズ関数について:
最初に私の友人 y10k の例を引用したいと思います:
例 3.

たとえば、次のように使用できます。サーバーとクライアントの設定情報ですが、この情報はクライアントによって異なります。phpinfo() 関数の出力を保存したい場合はどうすればよいでしょうか?バッファ制御がない前はまったく方法がなかったとも言えますが、バッファ制御を使えば簡単に解決できます。
プログラムコードプログラムコード

<?php
ob_start(); //打开缓冲区
phpinfo(); //使用phpinfo函数
$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info
$file=fopen(\&#39;info.txt\&#39;,\&#39;w\&#39;); //打开文件info.txt
fwrite($file,$info); //写入信息到info.txt
fclose($file); //关闭文件info.txt
?>
ログイン後にコピー

上記の方法を使用してください。 , 以前はできなかったと思いますが、さまざまなユーザーの 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系列函数实现。
对于第一种方法,因为不是这篇文章所要研究的问题,所以不再赘述。
我们现在来看一看第二种方法的具体实现:
Example 4.

程序代码 程序代码

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

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

二、 捕捉输出

以上的Example 4.是一种最简单的情况,你还可以在写入前对$content进行操作……
你可以设法捕捉一些关键字,然后去对它进行再处理,比如Example 3.所述的PHP语法高亮显示。个人认为,这个功能是此函数最大的精华所在,它可以解决各种各样的问题,但需要你有足够的想象力……
Example 5.

程序代码 程序代码

<?php
Function run_code($code) {
If($code) {
ob_start();
eval($code);
$contents = ob_get_contents();
ob_end_clean();
}else {
echo "错误!没有输出";
exit();
}
return $contents;
?>
}
ログイン後にコピー

以上这个例子的用途不是很大,不过很典型$code的本身就是一个含有变量的输出页面,而这个例子用eval把$code中的变量替换,然后对输出结果再进行输出捕捉,再一次的进行处理……

Example 6. 加快传输

程序代码 程序代码

<?
/*
** Title.........: PHP4 HTTP Compression Speeds up the Web
** Version.......: 1.20
** Author........: catoc <catoc@163.net>
** Filename......: gzdoc.php
** Last changed..: 18/10/2000
** Requirments...: PHP4 >= 4.0.1
** PHP was configured with --with-zlib[=DIR]
** Notes.........: Dynamic Content Acceleration compresses
** the data transmission data on the fly
** code by sun jin hu (catoc) <catoc@163.net>
** Most newer browsers since 1998/1999 have
** been equipped to support the HTTP 1.1
** standard known as \"content-encoding.\"
** Essentially the browser indicates to the
** server that it can accept \"content encoding\"
** and if the server is capable it will then
** compress the data and transmit it. The
** browser decompresses it and then renders
** the page.
**
** Modified by John Lim (jlim@natsoft.com.my)
** based on ideas by Sandy McArthur, Jr
** Usage........:
** No space before the beginning of the first \&#39;<?\&#39; tag.
** ------------Start of file----------
** |<?
** | include(\&#39;gzdoc.php\&#39;);
** |? >
** |<HTML>
** |... the page ...
** |</HTML>
** |<?
** | gzdocout();
** |? >
** -------------End of file-----------
*/
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, \&#39;x-gzip\&#39;) !== false) return \"x-gzip\";
if (strpos($HTTP_ACCEPT_ENCODING,\&#39;gzip\&#39;) !== false) return \"gzip\";
return 0;
}
/* $level = compression level 0-9, 0=none, 9=max */
function GzDocOut($level=1,$debug=0){
$ENCODING = CheckCanGzip();
if ($ENCODING){
print \"n<!-- Use compress $ENCODING -->n\";
$Contents = ob_get_contents();
ob_end_clean();
if ($debug){
$s = \"<p>Not compress length: \".strlen($Contents);
$s .= \"
Compressed length: \".strlen(gzcompress($Contents,$level));
$Contents .= $s;
}
header(\"Content-Encoding: $ENCODING\");
print \"x1fx8bx08x00x00x00x00x00\";
$Size = strlen($Contents);
$Crc = crc32($Contents);
$Contents = gzcompress($Contents,$level);
$Contents = substr($Contents, 0, strlen($Contents) - 4);
print $Contents;
print pack(\&#39;V\&#39;,$Crc);
print pack(\&#39;V\&#39;,$Size);
exit;
}else{
ob_end_flush();
exit;
}
}
?>
ログイン後にコピー

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

PHP empty()函数的说明

以上がPHP での Ob_start 使用状況分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート