为何在Event Source中需要设置无限循环?
为何在Event Source中需要设置无限循环?
嘿,我来给你唠明白这个事儿!
首先得搞懂Event Source(也就是咱们常说的SSE,服务器推送事件)的核心逻辑——它是服务器主动、持续给客户端推消息的单向长连接。但PHP脚本有个默认特性:代码执行完就自动结束,连接也就跟着断开了。这时候客户端发现连接断了,会自动发起重试,但这可不是咱们想要的效果。
回到你的项目场景:你的script.js先给handler.php发请求,接着立刻连transmitter.php要接收消息。如果transmitter.php不搞无限循环,那脚本跑一遍就结束了,连接秒断,客户端会反复重试,既浪费服务器资源,还根本没法实时收到后续的消息——毕竟服务器都没保持连接,咋主动给你推新内容?
那无限循环的作用就很关键了:
- 维持长连接:让
transmitter.php脚本一直处于运行状态,不自动结束,这样客户端和服务器的连接就能一直保持着,不会动不动就断开重连。 - 实时监听并推送消息:在循环里你可以加逻辑,比如每隔一小会儿检查有没有新的事件(比如
handler.php处理完请求后生成的结果),一旦有新消息,就能立刻通过连接推给客户端。 - 当然啦,循环里也得加些“缓冲”操作,比如
flush()和ob_flush(),这俩能让PHP把消息立刻发送出去,别攒在缓存里;还要加个sleep(1)或者类似的延迟,不然脚本会疯狂占用CPU资源,服务器可遭不住——就好比你每隔一秒抬头看看有没有新消息,而不是一秒钟看几百次,省劲儿多了。
说白了,无限循环就是给SSE的服务器端脚本“续上命”,让它能一直等着给客户端推消息,直到客户端主动断开(比如用户关了页面),这样才符合SSE实时推送的初衷嘛!
备注:内容来源于stack exchange,提问作者Abb
相关产品推荐
相关产品推荐

