swoole方案 SSE (Server-Sent Events) 单向推送服务

张开发
2026/4/28 13:11:55 15 分钟阅读

分享文章

swoole方案 SSE (Server-Sent Events) 单向推送服务
浏览器和服务器建一条不断开的HTTP连接服务器想推就推浏览器收着。单向的浏览器不能通过这条连接发消息回来。比 WebSocket 少握一次手协议更简单。---代码?php$servernewSwoole\Http\Server(0.0.0.0,9502);$server-on(request,function($req,$res)use($server){// SSE 必须的响应头$res-header(Content-Type,text/event-stream);$res-header(Cache-Control,no-cache);$res-header(X-Accel-Buffering,no);// 告诉 nginx 别缓冲// 每秒推一次假股票数据Swoole\Timer::tick(1000,function($timerId)use($res,$server){$datajson_encode([symbolAAPL,priceround(150(mt_rand(-100,100)/100),2),timedate(H:i:s),]);// SSE 格式固定data: 内容\n\n$ok$res-write(data:$data\n\n);// 客户端断了就停定时器if(!$ok)Swoole\Timer::clear($timerId);});});$server-start();---浏览器端5行scriptconstesnewEventSource(http://localhost:9502);es.onmessageeconsole.log(JSON.parse(e.data));es.onerror()es.close();/script---解释SSE格式就是普通HTTP响应但不关闭连接一直往里写 data:xxx\n\n浏览器认识这个格式会自动触发onmessage$res-write()Swoole 的分块写不调end()连接就不断Timer::tick(1000,...)每1000ms 跑一次回调不阻塞其他请求Swoole 协程调度的$okfalse客户端关了标签页write()返回false这时候清掉定时器不然一直在跑---测试 php server.php# 终端看推送curl-Nhttp://localhost:9502# 输出# data: {symbol:AAPL,price:150.42,time:14:23:01}# data: {symbol:AAPL,price:149.98,time:14:23:02}

更多文章