我正在将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,然后flush发送第一条消息,然后在页面结束时发送第二条消息。
使用HHVM (和nginx),设置Content-encoding头部是有效的(它显示在浏览器中),但hhvm或nginx忽略它并将页面作为gzipped内容发送,因此浏览器使用二进制数据解释content-encoding=none。
如何在HHVM的php代码中禁用gzip?
(我知道我可以在配置文件中关闭它,但我希望它在几乎所有页面加载时都保持打开,除了几个运行速度较慢的页面。)
发布于 2014-05-09 10:11:04
虽然我的建议是使用不同的nginx位置路径和不同的gzip配置,但这里有一个更好的替代解决方案来实现您想要的结果。
更好的解决方案:
当你在后台工作时,保持连接打开(浏览器加载条旋转)通常被认为是不好的做法。
从PHP5.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();https://stackoverflow.com/questions/23540726
复制相似问题