对于 php flush - 如何禁用特定文件的 gzip?
Posted
技术标签:
【中文标题】对于 php flush - 如何禁用特定文件的 gzip?【英文标题】:For php flush - how to disable gzip for specific file? 【发布时间】:2012-05-03 06:26:59 【问题描述】:我有一个对 somefile.php 的 ajax 调用。我希望 php 脚本执行一个简单的任务,然后将数据发送回用户,并且只执行非常耗时的任务。所以我需要在第一个简单任务之后刷新输出。它不起作用,可能是因为我启用了 gzip。
我绝对不想在所有虚拟主机上禁用 gzip,也不想在 somefile.php 所在的所有文件夹中禁用 gzip。我只想为这个特定文件禁用它。这可能吗?
编辑:
这是我在我的 apache conf 中包含的内容:
<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 秒后我仍然可以看到所有输出。
【问题讨论】:
如果是你的 web 服务器处理 gzip 压缩,我认为你不能通过 PHP 禁用它。 也许看看这个:***.com/questions/1922934/… 【参考方案1】:把这个放到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 将$
从正则表达式中去掉,并包含请求参数。喜欢ajax\.php\?a=download
。【参考方案2】:
我正在寻找相同问题的解决方案。这对我有用,但不幸的是它似乎不是一个有效的标题。
<?
header("Content-Encoding: none");
?>
【讨论】:
这里是Content-Encoding
规范:w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.5
header("Content-Encoding: identity");
听起来更正确。
我正在使用 SimpleHTMLDom 进行抓取,它可以完成这项工作等等,但不幸的是它正在返回压缩数据。我对此有一个修复,但它不适合我正在使用的功能。所以我尝试了这些技巧来阻止页面发送 Gzip 数据,但这里的建议都不起作用。
@e2-e4 我知道identity
是正确的,但有时您有代理服务器或其他无法更改的配置会干扰对所有流量的编码。【参考方案3】:
apache_setenv()
是正确的。请参阅文档。
http://php.net/manual/en/function.apache-setenv.php#60530
apache_setenv('no-gzip', '1');
您的问题是您使用ob_start()
打开了输出缓冲。把它注释掉。
我了解到apache_setenv()
仅适用于 PHP Apache 模块。使用 FPM 时不可用。在这种情况下,您必须使用.htaccess
来关闭 GZip。一个例子是
https://***.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 varnish
或 Via: 1.1 vegur
这样的标题。他们也会缓冲响应。
【讨论】:
以上是关于对于 php flush - 如何禁用特定文件的 gzip?的主要内容,如果未能解决你的问题,请参考以下文章