3

我总是在 PHP 中使用一个输出变量,在我回显它之前我会收集所有内容。然后我在某处(我不记得在哪里)读到,如果将输出变量拆分为数据包,然后回显每个数据包而不是整个输出变量,您将获得最佳性能。

真的怎么样?

4

4 回答 4

3

如果您使用 echo 输出非常大的字符串,最好使用多个 echo 语句。

这是因为Nagle 的算法导致数据通过 TCP/IP 缓冲的方式。


找到关于它的 Php-bugs 的注释:
http ://bugs.php.net/bug.php?id=18029

于 2009-05-31T15:25:38.693 回答
3

这将自动将大字符串分解成更小的块并回显它们:

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

于 2009-05-31T15:28:08.033 回答
0

我认为这里提出了一个更好的解决方案....

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 和原始网络带宽之间是否真的存在另一个可配置层。

于 2011-06-15T02:01:55.070 回答
0

这是我的解决方案版本,仅当连接未中止时才会回显。如果用户断开连接,则函数退出。

<?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');
于 2016-02-16T19:02:33.710 回答