如何在特定文件中禁用PHP flush时的gzip压缩?

14
我有一个 ajax 调用 somefile.php 文件。我希望 php 脚本可以完成简单任务,然后向用户发送数据,只有完成这些简单任务后才进行耗时任务。因此,在第一个简单任务之后需要刷新输出。但它并不起作用,可能是由于启用了 gzip。

我绝对不想在所有虚拟主机上禁用 gzip,也不想在包含 somefile.php 的所有文件夹中禁用 gzip。我只想为此特定文件禁用它。这可行吗?

编辑:

这是我在 apache 配置中包含的内容:

<FilesMatch \.php$>
    SetEnv no-gzip 1
</FilesMatch>

这是我的 PHP 脚本:

<?php
$sucesss = @apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);

ob_start();

for($i=0;$i<10;$i++)
{
    echo 'printing...';
    ob_flush();
    flush();

    sleep(1);
}
?>

它不起作用。10秒后,我仍然看到所有输出在一起。


1
如果是您的Web服务器处理gzip压缩,我认为您无法通过PHP禁用它。 - noli
也许可以看看这个链接:https://dev59.com/5XI-5IYBdhLWcg3wTWZu - noli
3个回答

11
这可能是正确的解决方案,但在某些设置中可能无法工作。您可能还需要在.htaccess文件中明确禁用压缩。然而,这个解决方案对我来说并没有起作用。
<?php
header("Content-Encoding: identity");
?>

我在寻找解决方案来解决同样的问题。这是对我有效的方法,但不幸的是,它似乎不是一个有效的标题。
<?
header("Content-Encoding: none");
?>

这是Content-Encoding规范: https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5 - Chloe
1
header("Content-Encoding: identity"); 听起来更正确。 - Déjà vu
我正在使用SimpleHTMLDom进行爬虫,它可以完成任务并且更多,但不幸的是它返回的是压缩数据。我有一个解决方法,但它不适用于我正在使用的函数。因此,我尝试了这些提示来防止页面发送Gzip数据,但这里的建议都没有起作用。 - WilliamK
我知道 identity 是正确的,但有时你会遇到代理服务器或其他配置,你无法更改它们,这些会干扰并编码所有流量。 - B. Martin

4

apache_setenv() 是正确的。请查看文档。

http://php.net/manual/zh/function.apache-setenv.php#60530

apache_setenv('no-gzip', '1');

您的问题在于您使用了ob_start()启用了输出缓冲。请注释掉该行代码。
我了解到,apache_setenv()仅适用于PHP Apache模块。当使用FPM时,它不可用。在这种情况下,您必须使用.htaccess关闭GZip压缩。以下是一个例子: https://stackoverflow.com/a/36212238/148844
RewriteRule ^dashboard/index - [E=no-gzip:1]
SetEnvIf REDIRECT_no-gzip 1 no-gzip
- 表示 NOOP,E 表示设置变量,1 是该变量的值。在重定向之后,变量会被重命名并添加前缀 REDIRECT_
如果输出仍在缓冲,请检查是否通过代理或缓存进行。查看是否存在像 Via: 1.1 varnishVia: 1.1 vegur 这样的头部信息。它们也会缓冲响应。

2
将以下内容放入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

你如何仅针对同一文件的某些请求禁用它?例如: ajax.php?a=list&id=5 -> 启用压缩 ajax.php?a=download&file=image.png -> 禁用压缩 - B. Martin
@B.Martin 在正则表达式中去掉 $ 并包含请求参数,例如 ajax\.php\?a=download - Chloe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接