【问题标题】:How can I disable gzip inside php code on HHVM? (eg setting content-encoding header)如何在 HHVM 的 php 代码中禁用 gzip? (例如设置内容编码头)
【发布时间】:2014-05-08 11:40:57
【问题描述】:

我正在将 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 压缩内容发送,因此浏览器会解释 content-encoding =无二进制数据。

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

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

【问题讨论】:

  • 内容最好保持明文,gzipping交给nginx处理。您可以为 nginx(针对特定的 url 模式)创建一个自定义规则,以不 gzip 输出。这听起来如何?
  • @Sina 谢谢,澄清一下:php 代码不做 gzip,只在 nginx 中,但在这种情况下它不应该 gzip,因为它是分两部分发送的。自定义规则将是最后的手段(这将意味着重新构建大量代码,这会很烦人,因为它一直在我们的旧设置下工作。)
  • 我认为这可能是一个 hhvm 错误,我在这里发布了一个问题:github.com/facebook/hhvm/issues/2641
  • 有完全相同的问题。有什么解决办法吗? stackoverflow.com/questions/34338641/…
  • 当时我放弃了它,从那以后就再也没有尝试过 HHVM。现在 php7 已经推出并以类似的速度运行,我们将坚持下去。

标签: php nginx http-headers gzip hhvm


【解决方案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();

【讨论】:

  • 感谢@Sina,这对某些人来说是个不错的选择。但在我的情况下,第二个状态消息比第一个更重要(后台任务通常只需要 2-3 秒。)所以在我的情况下,最好保持连接打开并删除第一个状态消息而不是失去第二个。
猜你喜欢
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 2015-03-11
  • 2018-02-27
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多