bri*_*rns 7 php apache output-buffering
我有一个发送大量记录的PHP脚本,我想在每个记录可用时立即刷新它们:客户端能够在每个记录到达时处理它,它不需要等待整个响应.我意识到整个传输需要稍长的时间,因为它需要以多个数据包发送,但它仍然允许客户端更快地开始工作.
我已经尝试了所有的不同flush()和ob_flush()功能,但似乎没有任何帮助克服线路实际发送数据的页面之前完成.我已经确认它不是网络浏览器,因为我已经使用telnet测试了它.
对我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文件中允许它.
您没有提到您使用的是什么 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 脚本中获取字节时小心翼翼地喷出的字节。您可以在浏览器中更改它,但为了工作,在服务器上更改一次似乎更明智。
也许这有帮助。
| 归档时间: |
|
| 查看次数: |
12701 次 |
| 最近记录: |