eventSource调用close关闭后会触发服务端的连接关闭事件,我们以swoole为例来看看:
<?php use Swoole\Http\Request; use Swoole\Http\Response; // 设置响应头 function setHeader(Response $response) { $response->header('Content-Type', 'text/event-stream'); $response->header('Cache-Control', 'no-cache'); $response->header('Connection', 'keep-alive'); } // 发送事件 function sendEvent(Response $response, $event, $data) { $response->write("event:$event\n"); $response->write("data:$data\n\n"); } // 用于存储定时器ID的数组 $timerIds = []; // 创建HTTP服务器 $server = new Swoole\Http\Server('0.0.0.0', 9502); // 处理请求 $server->on('request', function(Request $request, Response $response) use(&$timerIds) { if ($request->server['request_uri'] == '/html') { // 返回一个文件上传表单 $response->end(' <script type="text/javascript"> const data = new EventSource("/test"); data.onmessage = function(event) { document.body.innerHTML += event.data + \'<br>\'; }; setTimeout(function(){ data.close(); },5000); </script> '); } else { setHeader($response); $fd = $request->fd; // 发送初始化事件 sendEvent($response, 'init', 'Hello World'); global $timerIds; $timerIds[$fd] = swoole_timer_tick(1000, function () use ($response, $fd) { // if ($response->isWritable()) { $data = [ 'time' => date('H:i:s'), 'message' => 'Hello, world!', ]; $response->write('data: ' . json_encode($data) . "\n\n"); // } else { // 如果连接不可写,则停止定时器 // swoole_timer_clear($timerIds[$fd]); // unset($timerIds[$fd]); //} }); } }); // 在连接关闭时清除定时器 $server->on('close', function ($server, $fd) use (&$timerIds) { echo "Client {$fd} closed\n"; global $timerIds; if (isset($timerIds[$fd])) { swoole_timer_clear($timerIds[$fd]); unset($timerIds[$fd]); } }); // 启动服务器 $server->start();
网友回复
python如何调用openai的api实现知识讲解类动画讲解视频的合成?
html如何直接调用openai的api实现海报可视化设计及文本描述生成可编辑海报?
f12前端调试如何找出按钮点击事件触发的那段代码进行调试?
abcjs如何将曲谱播放后导出mid和wav格式音频下载?
python如何将曲子文本生成音乐mp3或wav、mid文件
python中mp3、wav音乐如何转成mid格式?
js在HTML中如何将曲谱生成音乐在线播放并下载本地?
python如何实现在windows上通过键盘来模拟鼠标操作?
python如何给win10电脑增加文件或文件夹右键自定义菜单?
python如何将音乐mp3文件解析获取曲调数据?