我想使用sleep()
或usleep()
推迟一些输出
这在终端中运行良好,但是当我在启用了gzip的服务器上运行脚本时,输出将完全缓冲,然后gzip,然后发送到浏览器。
有没有办法强制服务器(Apache)不缓冲脚本,
或强制服务器清除缓冲区,
或要在PHP中找到或者不知道Apache会不会发现这些东西?
然后,我可以禁用所有延迟,如果我不能强制直接输出,这将有所帮助......
编辑:可悲的是,我无法编辑任何配置文件,行为应该在许多不同的php设置中保持一致。
答案 0 :(得分:1)
由于额外信息而编辑
好的,然后我说:
您无法实现可靠的自动化
您可以对同一个域上的小型php文件执行标题卷曲(empty.php,其中回显""测试")以查看它是否在执行输出之前通过压缩发送。
但这会增加脚本中第一个字节的延迟。最简单的解决方案是脚本的配置文件,允许webadmin说:在将脚本部署到生产环境之前启用或禁用gzip。
因为gzip可以在php本身,服务器输出,代理等中使用......并且任何SEO有意识的管理员默认启用GZIP,因为它在谷歌提供奖励积分。所以实际上我建议放弃睡眠并使用多个ajax请求代替获取需要更长时间准备的信息,或者如果确实需要等待则使用websockets来提供您的信息。
<击> 您需要通过apache配置文件从缓存中排除文件。
请参阅:For php flush - how to disable gzip for specific file?
将它放在你的httpd.conf
中# exclude certain page requests (e.g. for requesting getMyFile.php?action=getFile&id=3 as non-compressed) SetEnvIfNoCase Request_URI getMyFile\.php$ no-gzip dont-vary
如果您有使用get参数的文件,请将结束$
标志从getMyFile\.php
答案 1 :(得分:0)
经过搜索和尝试,我发现了几件事。
1)可能存在通过zlib库执行的gzip压缩。这可以在运行时停用:
ini_set('zlib.output_compression', false);
2)可能还会通过Apache模块应用gzipping。在代码执行之后,这是不可能看到的,但是有一种非常可靠的方法可以解决它:
header("Content-Encoding: none");
这不符合标准,但它迫使Apache认为所提供的内容可能无法压缩。所以它不会跳进去。
可能还有很多其他情况(比如nginx或其他gzipping扩展等等),但在大多数情况下,这种技巧组合都可以解决问题:
// disable zlib
ini_set('zlib.output_compression', false);
// Force termination of all instantiated buffers
while (@ob_end_flush());
// prevent apache from gzipping
header("Content-Encoding: none");
// prevent the browsers from showing a cached version before showing the new one
header('Cache-Control: no-cache');
// Start the output to enable buffering
header('Content-Type: text/html; charset=utf-8' );
// Push the beginning of the page to the browser
ob_flush();
flush();
// Do stuff here.
希望这有助于任何人...