使用PHP和Apache防止输出缓冲

bri*_*rns 7 php apache output-buffering

我有一个发送大量记录的PHP脚本,我想在每个记录可用时立即刷新它们:客户端能够在每个记录到达时处理它,它不需要等待整个响应.我意识到整个传输需要稍长的时间,因为它需要以多个数据包发送,但它仍然允许客户端更快地开始工作.

我已经尝试了所有的不同flush()ob_flush()功能,但似乎没有任何帮助克服线路实际发送数据的页面之前完成.我已经确认它不是网络浏览器,因为我已经使用telnet测试了它.

bri*_*rns 6

对我output_buffering有用的唯一解决方案是将php.ini中的指令设置为"Off".我不想为整个服务器执行此操作,只需要这个特定的资源.通常你可以使用ini_setPHP脚本,但无论出于什么原因,php都不允许output_buffering以这种方式设置(参见php手册).

事实证明,如果您使用Apache,您可以output_buffering从服务器配置中设置一些php ini指令(包括),包括.htaccess文件.所以我在.htaccess文件中使用以下内容来禁用仅为该文件的output_buffering:

<Files "q.php">
    php_value output_buffering Off
</Files>
Run Code Online (Sandbox Code Playgroud)

然后在我的静态服务器配置中,我只需要AllowOverride Options=php_value(或更大的锤子AllowOverride All),以便在.htaccess文件中允许它.


Ted*_*ins 5

您没有提到您使用的是什么 Web 服务器,但我将在这里大胆猜测 Apache2。我击中的几乎与您描述的相同。我试图让我的 cgi 脚本在信息准备好时传回信息,而不是缓冲整个事情。在 curl 等中快速工作,但在浏览器(几乎任何浏览器)中缓冲,这至少令人抓狂。我经历了你描述的确切步骤。我的解决方案是修改sites-enabled/terrifico.comApache2 中的配置文件(有问题的行以

SetEnvIfNoCase

(您可以忽略该行上方和下方的内容,我只是显示它以供参考放置它的位置。)

<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName test.terrifico.com
ServerAlias test.terrifico.com

SetEnvIfNoCase Request_URI \.cgi$ no-gzip dont-vary

DocumentRoot /var/www/test.terrifico.com
Run Code Online (Sandbox Code Playgroud)

通过盯着来回移动的网络流量,我终于明白浏览器正在宣传它接受任何东西(即文本)的通货紧缩。例如,这就是浏览器和 curl 之间的区别。突出的一点是

接受编码:gzip,deflate,sdch

有一点关于chunking,但这并没有影响这个特定的问题。因此,浏览器请求mod_deflate启动,这打败了我在 cgi 脚本中获取字节时小心翼翼地喷出的字节。您可以在浏览器中更改它,但为了工作,在服务器上更改一次似乎更明智。

也许这有帮助。