SSE
目录
SSE 介绍
SSE 是一种服务端主动向客户端(浏览器)推送数据的技术。
大名鼎鼎的 ChatGPT 的 API 接口就用了这项技术,实现逐字返回的打字机效果。
服务端向客户端发送一个响应头:Content-Type: text/event-stream
然后服务端按如下格式发送数据:
: 注释
data: 数据\n
event: 事件\n
id: id值\n
retry: 重试时间间隔,单位:秒\n\n
其中每一行都是非必传项,每一行必须以
\n
结尾
\n\n
代表一次推送的结束
环境支持
名称 | 是否支持 | 备注 |
---|---|---|
Swoole | ✔ | |
Workerman | ✔ | |
php-fpm | ✔ | |
RoadRunner | ✖ | 暂时无法实现 |
使用示例
use Imi\Server\Http\Message\Emitter\SseEmitter;
use Imi\Server\Http\Message\Emitter\SseMessageEvent;
/**
* SSE.
*
* @Action
*/
public function sse(): void
{
$this->response->setResponseBodyEmitter(new class() extends SseEmitter {
protected function task(): void
{
$handler = $this->getHandler();
// 模拟推送数据
foreach (range(1, 100) as $i)
{
// 推送数据
$handler->send((string) new SseMessageEvent((string) $i));
usleep(10000);
}
}
});
}
SseMessageEvent
Imi\Server\Http\Message\Emitter\SseMessageEvent
类是 SSE 推送事件类,构造方法参数如下:
public function __construct(
?string $data = null,
?string $event = null,
?string $id = null,
?int $retry = null,
?string $comment = null
)