gpt4 book ai didi

php - 如何在 PHP 中实现服务器发送的事件?

转载 作者:可可西里 更新时间:2023-10-31 22:50:09 27 4
gpt4 key购买 nike

我已经用 php 和一个 while 循环设置了一个服务器发送的事件脚本,我不希望脚本必须保持关闭并且必须重新轮询,所以我把它全部放在一个 while 循环中。

问题是脚本卡住了,我不得不放弃这条路线,转而使用 node.js websocket 后端。

我的问题是,如果我曾经回去制作服务器发送的事件 php 脚本,我该如何实现它?
while 循环似乎没有切断它,因为它挂起脚本,如果它只是每秒连接和断开连接,它与长轮询没有什么不同,那么我如何创建一个 PHP 脚本,它将不挂,同时还发送 SSE 消息?

最佳答案

您似乎对 php 输出缓冲有疑问。尝试将这些行添加到 while 循环的末尾:

ob_flush();
flush();

这应该禁用输出缓冲。

编辑您也可以在一段时间后(即 10 分钟)终止脚本以减少服务器负载。

我已经为您创建了一个库,可以非常轻松地完成此操作。查一下here .

第二次编辑您是否有反向代理,例如 nginx 或 varnish?这可能是因为代理试图缓存输出的内容,但 SSE 脚本永远不会结束,直到您停止它,所以整个事情都会挂起。捕获输出的其他东西可能有类似的结果,例如 mod_deflate。

第三次编辑如果您有反向代理,您可以尝试关闭缓存以允许 SSE 工作。

在 PHP 中还有另一种方法可以禁用输出缓冲。请看下面的代码:

<?php
for($i=0;$i<ob_get_level();$i++){
ob_end_flush();
}
@apache_setenv('no-gzip',1);
@ini_set('implict_flush',1);
ob_implict_flush(true);

关于php - 如何在 PHP 中实现服务器发送的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14130347/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com