我总是在 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
我认为这里提出了一个更好的解决方案....
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 和原始网络带宽之间是否真的存在另一个可配置层。
这是我的解决方案版本,仅当连接未中止时才会回显。如果用户断开连接,则函数退出。
<?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');