如何在PHP中找到输出是否由Apache进行Gzip压缩?

如何在PHP中找到输出是否由Apache进行Gzip压缩?,php,apache,gzip,Php,Apache,Gzip,我想使用sleep()或usleep()延迟一些输出 这在终端中非常有效,但是当我在启用了gzip的服务器上运行脚本时,输出将被完全缓冲,然后gzip,然后发送到浏览器 有没有办法强制服务器(Apache)不缓冲脚本, 或强制服务器清除缓冲区, 或在PHP中查找Apache是否会gzip这些东西? 然后我可以禁用所有延迟,如果我不能强制直接输出,这将很有帮助 编辑:很遗憾,我无法编辑任何配置文件,在许多不同的php设置中,行为应该是一致的。编辑,因为有额外的信息。 好吧,那么我说: 您无法实现可

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

有没有办法强制服务器(Apache)不缓冲脚本,
强制服务器清除缓冲区,
在PHP中查找Apache是否会gzip这些东西?
然后我可以禁用所有延迟,如果我不能强制直接输出,这将很有帮助


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

编辑,因为有额外的信息。

好吧,那么我说: 您无法实现可靠的自动化。
您可以对同一个域上的一个小php文件(empty.php,echo的“testing”)执行头卷曲,以查看在执行输出之前它是否通过压缩发送。
但这会给脚本中的第一个字节增加延迟。最简单的解决方案是为您的脚本创建一个配置文件,允许webadmin在将您的脚本发布到生产环境之前说:gzip enabled或disabled

因为gzip可以在php本身、服务器输出、代理等中使用。。。任何SEO管理员都会默认启用GZIP,因为它会在谷歌获得额外积分。因此,实际上我建议放弃休眠,而是使用多个ajax请求来获取需要更长时间准备的信息,或者如果确实需要等待,则使用WebSocket来提供信息

您需要通过apache配置文件将文件从缓存中排除

见:

把这个放到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) 可能存在通过zlib库执行的gzip压缩。这可以在运行时停用:

ini_set('zlib.output_compression', false);
2) 此外,还可以通过Apache模块应用gzip。不可能在代码执行后看到这是否会发生,但有一种非常可靠的方法可以打破它:

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.

希望这对任何人都有帮助……

好的一点,尽管如此。遗憾的是,我无法访问配置文件,因为脚本应该在任何服务器上运行。我据此编辑了我的问题。找到了一个有效的解决方案,但我同意。它不能在所有环境下工作。我将补充一个答案……我想知道,当谷歌的pagespeed模块安装在apache或IIS中时,你的黑客攻击是否也有效。我认为这些解决方案中的大多数可能也会在共享主机环境中出现问题,并且ini_集被阻塞。