如何在PHP中查找输出是否会被Apache gzip压缩?

时间:2017-03-22 14:54:11

标签: php apache gzip

我想使用sleep()usleep()推迟一些输出 这在终端中运行良好,但是当我在启用了gzip的服务器上运行脚本时,输出将完全缓冲,然后gzip,然后发送到浏览器。

有没有办法强制服务器(Apache)不缓冲脚本,
强制服务器清除缓冲区,
要在PHP中找到或者不知道Apache会不会发现这些东西? 然后,我可以禁用所有延迟,如果我不能强制直接输出,这将有所帮助......

编辑:可悲的是,我无法编辑任何配置文件,行为应该在许多不同的php设置中保持一致。

2 个答案:

答案 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.

希望这有助于任何人...