著者: Laruence この記事のアドレス: http://www.laruence.com/2011/02/13/1870.html 転載する場合は出典を明記してください
大きな文字列を出力するために ECHO が使用されていることにお気づきかもしれませんPHP で を実行すると、明らかに実行時間が長くなり、PHP の ECHO パフォーマンスが非常に悪いと考える人もいるでしょう
その理由は以前の記事で説明しましたが、「PHP の ECHO パフォーマンスが低い」についても修正したいと思います。この誤解
しかし、前回の記事では理由を説明するだけで、この問題を回避する方法については紹介していませんでした。本日、社内の特定の製品ライン (Apache with PHP) で問題が発見されました。短期間に大量のダウンロード リクエストが開始され、結果として http 接続数とデータベース接続数が急増します。データベース接続数が急増する理由は次のとおりです。データベース接続は単一列モードであり、この方法ではリクエストが処理されるまでデータベース リンクが解放されません。リクエストの処理時間が長すぎると、大量のデータベース リンクが存在します。
そして、このユーザーのネットワーク速度は非常に遅いので、以下の図に示すように、ECHO の「パフォーマンス」が非常に悪く、ダウンロード時間が非常に長いです。これは、今日話したい質問、ECHO を高速化し、PHP リクエスト処理プロセスをできるだけ早く終了させる方法にもつながります...ECHO が遅い理由は、待機しているためです。 「書き込みデータ」が正常に返されるようにするため、比較的簡単な方法は、出力バッファをオンにすることです。
php.ini を編集
Output_buffering = 4096 //byte
もちろん、スクリプト内で使用することもできます。ob_start を呼び出します。 () 明示的に:
ob_start(); echo $huge_string; //その他のロジック ob_end_flush(); ここで、ob_start はサイズ 4096 のバッファを開きます。これで、データが一時的に出力バッファに書き込まれるため、ECHO は正常に実行され、バッファーの最後まで待機します。スクリプトを作成すると、データは一度にクライアントに送信されます (厳密に言えば、Web サーバーに送信されます)
しかし、これでは、最終的にこれらのデータを送信するために PHP が必要になるため、今日発生した問題は解決されません。クライアント(この時点ではWebServerの出力バッファは考慮されていません)にとって、このプロセスは終了せず、リクエストはクローズされず、PHPはDBのデストラクタを実行しません~
ということで、夢なので、 Apache の出力キャッシュを使用できます。つまり、実行プロセスを次のように変更します。
高速化された ECHO 図
PHP が 100K データを出力すると仮定すると、Apache の出力キャッシュはより大きくなければなりません。 100K より大きい場合、Apache の出力キャッシュがいっぱいになると、実際にはクライアントに送信され、このプロセス中にその時点で実行される ECHO がブロックされて待機します
それでは、Apache の出力キャッシュを変更するにはどうすればよいでしょうか?ファイル内で、SendBufferSize 設定コマンドを使用します。
SendBufferSize 4096 //byt であることに注意してください。SendBufferSize の具体的な手順については、http://httpd.apache.org/docs/2.0/en/mod/mpm_common を参照してください。 .html#sendbuffersize
注: php-cgi モードを備えた他の Web サーバーについては、関連する Web サーバーのマニュアルを読んで同様の設定を見つけてください
これで、実行が完了すると、PHP の ECHO はコンテンツを Apache に直接配信します。 PHP はコンテンツの送信を待機しなくなり、クライアントは完了して終了します。これにより、ECHO の実行効率が向上します。 、print、file_put_contents(“php://output” )...など、これらは ECHO と同じです
最後に、これは元の ECHO の待ち時間を Apache に転送するだけで、実際の時間は短縮されません。クライアントがコンテンツを取得するプロセスが高速化されるだけであり、PHP の処理プロセスが短縮され、PHP の終了時間が短縮され、間接的にリソース占有率が増加します。