【问题标题】:How to find out in PHP, if the output will be gzipped by Apache?如何在 PHP 中找出输出是否会被 Apache 压缩?
【发布时间】:2017-08-14 18:38:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: php apache gzip


    【解决方案1】:

    编辑因为有额外的信息

    好的,那我说: 您无法拥有可靠的自动化。
    您可以对同一域上的一个小 php 文件进行标头卷曲(empty.php 回显的“测试”),以查看它是否在执行输出之前通过压缩发送。
    但这会增加脚本中第一个字节的延迟。最简单的解决方案是为您的脚本创建一个配置文件,让网络管理员在将您的脚本投入生产之前说:启用或禁用 gzip。

    因为 gzip 可以在 php 本身、服务器输出、代理等中使用...而且任何有 SEO 意识的管理员都默认启用 GZIP,因为它可以在 google 中提供奖励积分。所以实际上我建议放弃睡眠并使用多个 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 末尾留下 $ 签名

    【讨论】:

    • 好点,我也是。遗憾的是,我无权访问配置文件,因为脚本应该在任何服务器上运行。我相应地编辑了我的问题。
    • 找到了一个可行的解决方案,但我同意。它不适用于所有环境。我会添加一个答案...
    【解决方案2】:

    经过一番搜索和尝试,我发现了一些东西。

    1) 可能存在通过 zlib 库执行的 gzip 压缩。这可以在运行时停用:

    ini_set('zlib.output_compression', false);
    

    2) 可能还有通过 Apache 模块应用的 gzipping。代码执行后是否会发生这种情况是不可能看到的,但是有一种非常可靠的方法可以打破它:

    header("Content-Encoding: none");
    

    这不符合标准,但它迫使 Apache 认为提供的内容可能无法压缩。所以它不会跳进去。

    可能还有很多其他情况(如 nginx,或其他 gzip 扩展等),但在大多数情况下,这种技巧组合可以解决问题:

    // 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.
    

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

    【讨论】:

    • 我想知道当 google 的 pagespeed 模块安装在 apache 或 IIS 中时,您的 hack 是否也有效。而且我认为这些解决方案中的大多数也可能会破坏共享托管环境以及 ini_set 被阻止的位置。
    猜你喜欢
    • 2011-10-11
    • 2012-02-19
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多