PHP エコーのパフォーマンス
-
06-09-2019 - |
質問
私は常に PHP で出力変数を使用し、エコーする前にすべてのコンテンツを収集します。次に、出力変数をパケットに分割し、出力変数全体ではなく各パケットをエコーすると最高のパフォーマンスが得られるということをどこかで読みました (場所は覚えていませんが)。
実際はどうですか?
解決
あなたは、エコーと本当に大きな文字列を出力している場合、複数のエコーステートメントを使用することをお勧めします。
これはデータを原因とする Nagleアルゴリズムは、TCPの上にバッファリングする方法であります/ IPます。
それについてPHP-バグのノートを見つけます。
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
私はよりよい解決策がここに提示されると思います....
http://wonko.com/post/seeing_poor_performance_using_phps_echo_statement_heres_why#comment-5606する
........
Guysは、私はさらにそれを絞り込むと思います!
以前に述べたように、、PHPのバッファリングは、スクリプトの最後にPHPのレースを聞かせて、それはまだApacheのにすべてのデータを渡すためにしようとしているときに「ハング」になるよりも後になります。
今、私はこれを測定する(以前のコメントを参照)が、実際にPHPの内部待機期間を排除するだけでなく、ことができました。私はSendBufferSizeディレクティブでApacheのSendBufferを増やすことでことをやっています。
これは速いPHPからデータをプッシュします。私は、次のステップは速いのApacheの外にそれを得ることであろうと思いますが、私は、Apacheと生のネットワーク帯域幅の間に別の設定可能な層が実際に存在しているかはわからない。
このは、ソリューションの私のバージョンは、それは接続が中断されていない場合にのみ、エコー表示です。ユーザーが切断した場合、関数は終了します。
<?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');