14

我有一个对 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 秒后我仍然可以看到所有输出。

4

3 回答 3

10

我一直在寻找相同问题的解决方案。这对我有用,但不幸的是它似乎不是一个有效的标题。

<?
header("Content-Encoding: none");
?>
于 2014-01-15T13:23:37.310 回答
4

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://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 varnish或的标题Via: 1.1 vegur。他们也会缓冲响应。

于 2016-03-21T22:35:03.077 回答
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
于 2012-04-23T16:39:36.427 回答