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 . '<br/>'; sleep($i + 1); //}
执行后你会发现,它不会像常规逻辑每隔几秒就有输出,而是直到脚本循环结束后,才会一次性输出。这种情况在脚本处理结束之前,浏览器界面会一直保持空白,这是由于数据量太小,输出缓冲区没有写满。写数据的顺序:echo语句输出到PHP缓冲区、TCP缓冲区、浏览器。
接下来我们再修改output_buffering=0,仍输出较少数据,但实际数据已经大于PHP缓冲区。代码如下:
for ($i = 0; $i< 10; $i++) { echo $i . '<br/>'; 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('./f4096') . $i . '<br/>'; 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('./f4096') . $i . '<br/>'; 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('Y-m-d h:i:s'); ?> </body> </html> <?php $output = ob_get_contents(); ob_end_flush();echo '<! output>'.$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()
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 サイトの他の関連記事を参照してください。

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

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

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

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

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

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

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

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


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

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

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

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