当使用php-mod和fastcgi时,代码执行完美,每秒钟我都会得到一个输出,但切换到php-fpm时,代码会滞后几秒钟,然后根据输出大小进行输出
尝试了以下内容和组合 在PHP ini中设置输出缓冲区0 ob_implicit_flush ob_start ob_end_flush 标头Content-Encoding =无 hidden_flush 1 ob_end_clean
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while( true ){
$time = date('r');
echo "retry:1000\r\n";
echo "data: ".$time;
echo "\r\n\r\n";
ob_flush();
flush();
sleep(1);
}
?>
这是用于生产服务器的,不是php-mod,我也可以在Fastcgi中使用它 FcgidOutputBufferSize 0 有没有一种方法可以使代码在php-fpm上工作,以便像php-mod和fastcgi一样立即发送输出?
P.S运行:Ubuntu 18.04,Apache 2.4.29,PHP 7.2
答案 0 :(得分:0)
几天后,我发现使它在php-fpm中工作的唯一方法是填充输出缓冲区。这真是效率低下!让我解释一下:
假设您正在使用服务器发送事件,并且输出缓冲区为4096,即使不返回任何内容,您也将每秒处理一次,即使您仍向客户端发送4Kb输出,mod_php和fast-cgi仅在存在以下情况时才发送数据输出。
如果其他人有此问题,这是我最好的解决方案:在php-fpm ex上运行主站点。 example.com并创建一个子域。 push.example.com并在子域上设置fast-cgi / php_mod [NO RECOMMENDED PRODUCTION],现在您可以保持连接打开并处理数据,而无需将输出发送到客户端。
PS。我将Session变量保存在数据库中,以便域和子域都可以访问它,请参见https://github.com/dominicklee/PHP-MySQL-Sessions。另一件事是让子域发送CORS。在PHP中添加标头('Access-Control-Allow-Origin:https://example.com');