对于 php flush - 如何禁用特定文件的 gzip


For php flush - how to disable gzip for specific file?

我有一个对某个文件的 ajax 调用.php . 我希望 PHP 脚本执行一个简单的任务,而不是将数据发回给用户,并且只执行非常耗时的任务。 所以我需要在第一个简单任务后刷新输出。 它不起作用,可能是因为我启用了 gzip。

我绝对不想在所有 vhost 中禁用 gzip,也不要在某个文件所在的所有文件夹中禁用 gzip.php。 我只想为此特定文件禁用它。 这可能吗?

编辑:

这是我在 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 秒后我仍然看到所有输出。

我正在寻找同一问题的解决方案。这对我有用,但不幸的是,它不是有效的标头。

<?
header("Content-Encoding: none");
?>

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 varnishVia: 1.1 vegur 等标头。它们还将缓冲响应。

把它放在 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