加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

如何在PHP中实现Server Sent Events?

发布时间:2020-12-13 16:42:23 所属栏目:PHP教程 来源:网络整理
导读:我已经设置了一个服务器发送的事件脚本与 PHP和一个while循环,我不希望脚本不得不保持关闭,必须repoll,所以我把它全部在一个循环. 问题是脚本被卡住了,我不得不放弃该路由,而是使用一个node.js websocket后端. 我的问题是,如果我曾经回到制作服务器发送的事
我已经设置了一个服务器发送的事件脚本与 PHP和一个while循环,我不希望脚本不得不保持关闭,必须repoll,所以我把它全部在一个循环.

问题是脚本被卡住了,我不得不放弃该路由,而是使用一个node.js websocket后端.

我的问题是,如果我曾经回到制作服务器发送的事件php脚本,我该如何实现?
而循环似乎并没有因为它挂起脚本而被削减,而且如果它每秒连接和断开连接,它与长轮询没有什么不同,所以如何创建一个不会挂起的PHP脚本,同时也发送上交所信息?

你似乎在php输出缓冲上有问题.尝试将这些行添加到while循环的末尾:
ob_flush();
flush();

这应该禁用输出缓冲.

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

我创建了一个图书馆,让你很容易做到这一点.检查它here.

第二编辑
你有反向代理,如nginx还是清漆?这可能是因为代理尝试缓存输出的内容,但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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读