PHP请求中逐行输出

PHP程序配合apache或者nginx前端机可以实现逐行输出,但是需要设置一些参数。

php.ini配置

  • output_buffering = false

这个参数必须设置以关闭缓冲区,且不能从ini_set设置,因为这个参数是一个PHP_INI_PERDIR参数,PHP_INI_PERDIR:指令可以在php.ini、httpd.conf或.htaccess文件中修改。修改后必须要重启httpdserver才能生效。

必须需要禁用gzip压缩

由于浏览器的特性,如果开启了gzip压缩,部分浏览器也得等到输出都回来才会执行解压并输出操作。如果有apache_setenv这个函数的权限,可以从PHP中执行

apache_setenv('no-gzip', 1);  

关闭Apache默认的gzip压缩。

万能的一招

header("Content-Encoding: none");  

直接指定content-encoding为一个错误的值,PHP的下层(Apache或者nginx)也不会执行gzip压缩。

示例代码

<?php  
header("Content-Encoding: none");  
echo str_pad(" ", 256);// 部分浏览器数据不足256不开始显示  
for ($i = 0; $i < 4; $i++) {  
    var_dump($i . '<br/>');
    ob_flush(); //ob_*系列函数, 是操作PHP本身的输出缓冲区
    flush();  //通知操作系统底层,尽快把数据给客户端浏览器
    sleep(1); 
}

注意

  • 新浪云PHP运行环境标准运行环境output_buffering是关闭的直接用就行。
  • 新浪云环境不能执行apache_setenv函数,只能通过header("Content-Encoding: none");完成取消gzip压缩。