如何在HHVM上的PHP代码中禁用gzip? (例如设置内容编码头)

时间:2014-05-08 11:40:57

标签: php nginx http-headers gzip hhvm

我将PHP代码转换为hhvm。特别是一个页面有时需要在发送一些电子邮件和一些其他慢速任务之前将状态消息刷新()到浏览器,然后更新状态消息。

在hhvm之前(使用php-fpm和nginx)我用过:

header('Content-Encoding: none;');

echo "About to send emails...";
if (ob_get_level() > 0) { ob_end_flush(); }
flush();

// Emails sent here

echo "Emails sent.";

因此内容编码会停止使用gzip,然后刷新发送第一条消息,然后在页面结束时发送第二条消息。

使用HHVM(和nginx),设置Content-encoding标头有效(它显示在浏览器中),但是hhvm或nginx忽略它并将页面作为gzip压缩内容发送,因此浏览器会解释内容编码=无二进制数据。

如何在HHVM上禁用php代码中的gzip?

(我知道我可以在配置文件中将其关闭,但我希望它几乎每个页面加载都会保留,除了一些运行速度较慢的页面。)

1 个答案:

答案 0 :(得分:1)

虽然我的建议是使用不同的gzip配置使用不同的nginx位置路径,但这是一个更好的替代解决方案,可以实现您想要的目标。

更好的解决方案:

当您在后台工作时,通常将连接打开(以及浏览器加载条旋转)称为不良做法。

自PHP 5.3.3起,有一个方法fastcgi_finish_request()可以刷新数据并关闭连接,同时它继续在后台运行。

现在,this is unfortunately not supported yet on HHVM。但是,有另一种方法可以做到这一点。

HHVM替代方案:

您可以改用register_postsend_function('function_name');。这将关闭连接,给定的功能将在后台执行。

以下是一个例子:

<?php

echo "and ...";

register_postsend_function(function() {
  echo "... you should not be seeing this";
  sleep("10"); // do a lot of work
});

die();