我已经设置了一个服务器发送的事件脚本与
PHP和一个while循环,我不希望脚本不得不保持关闭,必须repoll,所以我把它全部在一个循环.
@H_404_1@问题是脚本被卡住了,我不得不放弃该路由,而是使用一个node.js websocket后端.
@H_404_1@我的问题是,如果我曾经回到制作服务器发送的事件PHP脚本,我该如何实现?
而循环似乎并没有因为它挂起脚本而被削减,而且如果它每秒连接和断开连接,它与长轮询没有什么不同,所以如何创建一个不会挂起的PHP脚本,同时也发送上交所信息?
而循环似乎并没有因为它挂起脚本而被削减,而且如果它每秒连接和断开连接,它与长轮询没有什么不同,所以如何创建一个不会挂起的PHP脚本,同时也发送上交所信息?
你似乎在PHP输出缓冲上有问题.尝试将这些行添加到while循环的末尾:
你有反向代理,如Nginx还是清漆?这可能是因为代理尝试缓存输出的内容,但SSE脚本永远不会停止,直到你停止它,所以整个事情挂起来.捕获输出的其他内容可能具有类似的结果,如mod_deflate. @H_404_1@第三次编辑
如果您有反向代理,您可以尝试关闭缓存以允许SSE工作. @H_404_1@PHP中还有一种方法来禁用输出缓冲.请参阅以下代码:
ob_flush(); flush();@H_404_1@这应该禁用输出缓冲. @H_404_1@编辑您还可以在一段时间(即10分钟)后终止脚本,以减少服务器负载. @H_404_1@我创建了一个图书馆,让你很容易做到这一点.检查它here. @H_404_1@第二编辑
你有反向代理,如Nginx还是清漆?这可能是因为代理尝试缓存输出的内容,但SSE脚本永远不会停止,直到你停止它,所以整个事情挂起来.捕获输出的其他内容可能具有类似的结果,如mod_deflate. @H_404_1@第三次编辑
如果您有反向代理,您可以尝试关闭缓存以允许SSE工作. @H_404_1@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);