検索

phpのバッファ例を詳しく解説

Aug 10, 2017 am 11:27 AM
phpバッファ

PHP バッファはデフォルトで有効になっており、デフォルトのパラメータは php.ini 設定ファイルにあり、値は 4096 バイトです。その中で、output_buffering 構成パラメーターを見つけて、PHP バッファーのサイズを変更します。

開発者は、ob_start() 関数を使用して、スクリプト内の PHP バッファー メカニズムを手動で処理することもできます。このように、出力コンテンツが構成パラメータのサイズを超えた場合でも、ob_start() が十分な大きさに設定された後でのみ、データはブラウザに送信されません。スクリプトの実行が終了するか、ob_end_flush() 関数が呼び出され、データがブラウザに送信されます。 ob_start()函数手动处理PHP缓冲区机制。这样即便输出内容超过了配置参数的大小,也不会把数据传输给浏览器,ob_start()将PHP缓冲区空间设置到足够大,只有脚本执行结束后或调用ob_end_flush()函数,才会把数据发送给浏览器。

我们编辑php.ini配置文件,对output_buffering值进行修改并做如下测试。当output_buffering修改为4096时,输出较少数据,让它小于一个PHP缓冲区。代码如下:

for ($i = 0; $i< 10; $i++) {    
echo $i . &#39;<br/>&#39;;
    sleep($i + 1);      
    //}

执行后你会发现,它不会像常规逻辑每隔几秒就有输出,而是直到脚本循环结束后,才会一次性输出。这种情况在脚本处理结束之前,浏览器界面会一直保持空白,这是由于数据量太小,输出缓冲区没有写满。写数据的顺序:echo语句输出到PHP缓冲区、TCP缓冲区、浏览器。

接下来我们再修改output_buffering=0,仍输出较少数据,但实际数据已经大于PHP缓冲区。代码如下:

 for ($i = 0; $i< 10; $i++) {    echo $i . &#39;<br/>&#39;;
    flush();  //通知操作系统底层,尽快把数据发给客户端浏览器
    sleep($i + 1);      //}

该脚本的结果与刚才一定不一致,因为将缓冲区的容量设置为0,即禁用PHP缓冲区机制。 这时我们会在浏览器看到断断续续的间断性输出,而不必等到脚本执行完毕才看到输出。这是因为,数据没有在输出缓存中停留。写数据的顺序依次是echo输出到TCP缓冲区,再输出给浏览器。 我们再把参数修改为output_buffering=4096,输出数据大于一个缓冲区。此例中不调用ob_start()函数。 准备一个4KB大小的文件或者使用dd命令在shell下创建一个文件:

 $dd if=/dev/zero of=f4096 bs=4096 count=1

使用如下代码进行验证:

for ($i = 0; $i< 10; $i++) {    
echo file_get_contents(&#39;./f4096&#39;) . $i . &#39;<br/>&#39;;
    sleep($i +1);
    }

可以看到,程序响应还没结束(HTTP连接并未关闭),就可以看到间断性输出,浏览器界面不会一直保持空白。尽管启用了PHP输出缓冲区机制,但依然会间断性输出,而不是一次性输出,这是因为PHP缓冲区空间不够用,每写满一个缓冲区,数据就会发送到客户端浏览器。

和上例参数一样,即output_buffering=4096,输出数据大于一个PHP缓冲区。这次我们调用ob_start(),代码如下:

ob_start();      
//开启PHP缓冲区
for ($i = 0; $i< 10; $i++) {    
echo file_get_contents(&#39;./f4096&#39;) . $i . &#39;<br/>&#39;;
    sleep($i + 1);
}
ob_end_flush();

等到服务端脚本全部处理完,响应结束才会看到完整的输出。输出间隔时间很短,以至于感受不到停顿。在输出之前,浏览器一直会保持空白,等待服务器端数据。这是因为,PHP一旦调用了ob_start()函数,就会将PHP缓冲区扩展到足够大,直到ob_end_flush函数调用或者脚本运行结束才发送PHP缓冲区中的数据到客户端浏览器。

ob_start激活output_buffering机制。一旦激活,脚本不再直接输出给浏览器,而是先暂时写入PHP缓冲区。 PHP默认开启output_buffering机制,通过调用ob_start()函数把output_buffering值扩展到足够大。也可以通过$chunk_size来指定output_buffering的值。$chunk_size默认值是0,表示直到脚本运行结束后,PHP缓冲区中的数据才会发送到浏览器。若设置了$chunk_size的大小,则表示只要缓冲区中数据长度达到了该值,就会将缓冲区中的数据发送到浏览器。

可以通过指定$ouput_callback参数来处理PHP缓冲区中的数据,比如函数ob_gzhandler(),将缓冲区中的数据压缩后再传送给浏览器。

ob_get_contents()函数是获取一份PHP缓冲区中的数据拷贝,这是一个重要的函数。请看以下示例:

<?phpob_start();   
?>
<html>
<body>today is <?php echo date(&#39;Y-m-d h:i:s&#39;);  
 ?>
</body>
</html>
<?php
$output = ob_get_contents();
ob_end_flush();echo &#39;<! output>&#39;.$output;?>

以上脚本运行后,查看源代码,会出现两段相同的HTML,后者就是通过ob_get_contents()函数取得缓冲区里的内容。

ob_end_flush()ob_end_clean()这两个函数都会关闭输出缓冲。

不同的是,ob_end_flush()只是把PHP缓冲区中的数据发送到客户端浏览器,而ob_clean_clean()将PHP缓冲区中的数据删除,但不发送给客户端。

ob_end_flush()调用之后,PHP缓冲区中的数据依然存在,ob_get_contents()

php.ini 設定ファイルを編集し、output_buffering 値を変更して、次のテストを実行します。 output_buffering を 4096 に変更すると、出力されるデータが減り、PHP バッファーよりも小さくなります。コードは次のとおりです。 🎜rrreee🎜 実行後、従来のロジックのように数秒ごとに出力するのではなく、スクリプトループが終了するまで一気に出力することがわかります。この場合、データ量が少なすぎて出力バッファがいっぱいではないため、スクリプトの処理が完了するまでブラウザ インターフェイスは空白のままになります。データの書き込み順序: echo ステートメントは、PHP バッファー、TCP バッファー、ブラウザーに出力されます。 🎜🎜 次に、output_buffering=0 を変更します。これでも出力されるデータは少なくなりますが、実際のデータはすでに PHP バッファーよりも大きくなっています。コードは次のとおりです。 🎜rrreee🎜 バッファ容量が 0 に設定されており、PHP バッファ メカニズムが無効になっているため、このスクリプトの結果は先ほどと一致しないはずです。 現時点では、スクリプトが実行されて出力が表示されるまで待つ必要がなく、ブラウザーに断続的な出力が表示されます。これは、データが出力キャッシュに残らないためです。データの書き込み順序は、TCP バッファにエコーが出力され、ブラウザに出力されます。 次に、パラメーターをoutput_buffering=4096に変更すると、出力データは1つのバッファーよりも大きくなります。この例では、ob_start() 関数は呼び出されません。 4KB ファイルを準備するか、dd コマンドを使用してシェルの下にファイルを作成します: 🎜rrreee🎜 次のコードを使用して確認します: 🎜rrreee🎜 プログラムの応答が終了していない (HTTP 接続が閉じられていない) ことがわかります。断続的な出力では、ブラウザ インターフェイスが常に空白のままになるわけではありません。 PHP 出力バッファー メカニズムが有効になっているにもかかわらず、1 回限りの出力ではなく断続的な出力が行われます。これは、PHP バッファーのスペースが不足するたびに、データがクライアント ブラウザーに送信されるためです。 🎜🎜上記の例と同じパラメータ、つまり output_buffering=4096 では、出力データは 1 つの PHP バッファよりも大きくなります。今回は ob_start() を呼び出します。コードは次のとおりです: 🎜rrreee🎜 サーバー スクリプトが完全に処理され、応答が終了するまで、完全な出力は表示されません。出力間の間隔が非常に短く、一時停止を感じません。出力する前に、ブラウザは空白のままになり、サーバー側のデータを待ちます。これは、PHP が ob_start() 関数を呼び出すと、PHP バッファが十分なサイズに拡張され、ob_end_flush 関数が呼び出されるまで送信されないためです。呼び出されるか、クライアントブラウザへのスクリプト領域が終了します。 🎜🎜ob_start は、output_buffering メカニズムをアクティブにします。アクティブ化されると、スクリプトはブラウザに直接出力されなくなり、最初に一時的に PHP バッファに書き込まれます。 PHP はデフォルトで output_buffering メカニズムを有効にし、ob_start() 関数を呼び出して output_buffering 値を十分な大きさの値に拡張します。 $chunk_size を通じて output_buffering の値を指定することもできます。 $chunk_size のデフォルト値は 0 です。これは、スクリプトの実行が終了するまで、PHP バッファー内のデータがブラウザーに送信されないことを意味します。 $chunk_size のサイズが設定されている場合、バッファ内のデータ長がこの値に達する限り、バッファ内のデータがブラウザに送信されることを意味します。 🎜🎜関数 ob_gzhandler() などの $ouput_callback パラメータを指定することで、PHP バッファ内のデータを処理できます。これにより、送信前にバッファ内のデータが圧縮されます。ブラウザに。 🎜🎜ob_get_contents() 関数は、PHP バッファー内のデータのコピーを取得します。これは重要な関数です。次の例を参照してください: 🎜rrreee🎜 上記のスクリプトを実行した後、ソース コードを確認すると、2 つの同一の HTML が表示されます。後者は、ob_get_contents() を通じてバッファーの内容を取得します。コード>関数。 🎜🎜<code>ob_end_flush()ob_end_clean() の両方の関数は出力バッファをオフにします。 🎜🎜 違いは、 ob_end_flush() は PHP バッファ内のデータをクライアント ブラウザに送信するだけであるのに対し、 ob_clean_clean() は PHP バッファ内のデータを削除しますが、削除はしないことです。クライアントに送信されました。 🎜🎜 ob_end_flush() が呼び出された後も、PHP バッファー内のデータはまだ存在しており、ob_get_contents() は引き続き PHP バッファー内のデータのコピーを取得できます。 🎜

以上がphpのバッファ例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
トラフィックの高いウェブサイトのPHPパフォーマンスチューニングトラフィックの高いウェブサイトのPHPパフォーマンスチューニングMay 14, 2025 am 12:13 AM

thesecrettokeepingaphp-poweredwebsterunningsmootlyunderheavyloadinvolvesseveralkeystrategies:1)emform opcodecoduceSciptionexecutiontime、2)aatabasequerycachingwithiThing withiThistolessendavasoload、

PHPでの依存関係注射:初心者向けのコード例PHPでの依存関係注射:初心者向けのコード例May 14, 2025 am 12:08 AM

コードをより明確かつ維持しやすくするため、依存関係が関心(DI)に注意する必要があります。 1)DIは、クラスを切り離すことにより、よりモジュール化されます。2)テストとコードの柔軟性の利便性を向上させ、3)DIコンテナを使用して複雑な依存関係を管理しますが、パフォーマンスの影響と円形の依存関係に注意してください。

PHPパフォーマンス:アプリケーションを最適化することは可能ですか?PHPパフォーマンス:アプリケーションを最適化することは可能ですか?May 14, 2025 am 12:04 AM

はい、最適化されたAphPossibleandessention.1)CachingingusapCutoredatedAtabaseload.2)最適化、効率的なQueries、およびConnectionPooling.3)EnhcodeCodewithBultinctions、Avoididingglobalbariables、およびUsingopcodeching

PHPパフォーマンスの最適化:究極のガイドPHPパフォーマンスの最適化:究極のガイドMay 14, 2025 am 12:02 AM

keyStrategIestsoSificlyvoostphpappliceperformanceare:1)useopcodecachinglikeToreexecutiontime、2)最適化abaseの相互作用とプロペラインデックス、3)3)構成

PHP依存性噴射コンテナ:クイックスタートPHP依存性噴射コンテナ:クイックスタートMay 13, 2025 am 12:11 AM

aphpDependencyInjectionContaineriSATOULTAINATINAGECLASSDEPTINCIES、強化測定性、テスト可能性、および維持可能性。

PHPの依存噴射対サービスロケーターPHPの依存噴射対サービスロケーターMay 13, 2025 am 12:10 AM

SELECT DEPENTENCINGINOFCENT(DI)大規模なアプリケーションの場合、ServicElocatorは小さなプロジェクトまたはプロトタイプに適しています。 1)DIは、コンストラクターインジェクションを通じてコードのテスト可能性とモジュール性を改善します。 2)ServiceLocatorは、センター登録を通じてサービスを取得します。これは便利ですが、コードカップリングの増加につながる可能性があります。

PHPパフォーマンス最適化戦略。PHPパフォーマンス最適化戦略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedforspeedandEfficiencyby:1)enabingopcacheinphp.ini、2)PreparedStatementswithpordatabasequeriesを使用して、3)LoopswithArray_filterandarray_mapfordataprocessing、4)の構成ngincasaSearverseproxy、5)

PHPメールの検証:電子メールが正しく送信されるようにしますPHPメールの検証:電子メールが正しく送信されるようにしますMay 13, 2025 am 12:06 AM

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。