私は常にPHPで出力変数を使用しており、エコーする前にすべてのコンテンツを収集します。次に、出力変数をパケットに分割し、出力変数全体ではなく各パケットをエコーすると、最高のパフォーマンスが得られることをどこかで読みました(ただし、どこかは覚えていません)。
本当にどうですか?
私は常にPHPで出力変数を使用しており、エコーする前にすべてのコンテンツを収集します。次に、出力変数をパケットに分割し、出力変数全体ではなく各パケットをエコーすると、最高のパフォーマンスが得られることをどこかで読みました(ただし、どこかは覚えていません)。
本当にどうですか?
非常に大きな文字列を echo で出力する場合は、複数の echo ステートメントを使用することをお勧めします。
これは、Nagle のアルゴリズムがデータを TCP/IP 経由でバッファリングする方法によるものです。
それに関する Php-bugs に関するメモを見つけました:
http://bugs.php.net/bug.php?id=18029
これにより、大きな文字列が自動的に小さなチャンクに分割され、エコーアウトされます。
function echobig($string, $bufferSize = 8192) {
$splitString = str_split($string, $bufferSize);
foreach($splitString as $chunk) {
echo $chunk;
}
}
ソース: http://wonko.com/post/seeing_poor_performance_using_phps_echo_statement_heres_why
これは私のバージョンのソリューションです。接続が中止されていない場合にのみエコーします。ユーザーが切断すると、関数は終了します。
<?php
function _echo(){
$args = func_get_args();
foreach($args as $arg){
$strs = str_split($arg, 8192);
foreach($strs as $str){
if(connection_aborted()){
break 2;
}
echo $str;
}
}
}
_echo('this','and that','and more','and even more');
_echo('or just a big long text here, make it as long as you want');
より良い解決策がここに提示されていると思います....
http://wonko.com/post/seeing_poor_performance_using_phps_echo_statement_heres_why#comment-5606
.........
皆さん、さらに絞り込んだと思います!
前述のように、PHP バッファリングにより、PHP はスクリプトの最後まで競合しますが、その後、すべてのデータを Apache に渡そうとする間に「ハング」します。
これを測定するだけでなく (前のコメントを参照)、実際に PHP 内の待機期間をなくすことができました。SendBufferSize ディレクティブを使用して Apache の SendBuffer を増やすことで、これを実現しました。
これにより、データが PHP からより速くプッシュされます。次のステップは、Apache からより速くそれを取得することだと思いますが、Apache と生のネットワーク帯域幅の間に実際に別の構成可能なレイヤーがあるかどうかはわかりません。