代码之家  ›  专栏  ›  技术社区  ›  Ivar

PHP回声性能

  •  3
  • Ivar  · 技术社区  · 16 年前

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

    真的怎么样?

    4 回复  |  直到 8 年前
        1
  •  3
  •   Silfverstrom    16 年前

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

    这是因为 Nagle's algorithm 使数据通过TCP/IP进行缓冲。


    找到一个关于PHP错误的注释:
    http://bugs.php.net/bug.php?id=18029

        2
  •  3
  •   karim79    16 年前

    这将自动将大字符串拆分为较小的块,并将其回音出来:

    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

        3
  •  0
  •   Will    12 年前

    我认为这里有一个更好的解决方案……

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

        4
  •  0
  •   Fabrizio    8 年前

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

    <?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');
    
    推荐文章