imi v2.1.45 发布,支持优雅的 SSE 服务端推送功能,文档:doc.imiphp.com/v2.1/compon…
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
)
关于 imi
imi 是一款支持长连接微服务分布式的 PHP 开发框架,它可以运行在 PHP-FPM、Swoole、Workerman 和 RoadRunner 等多种容器环境下。
imi 提供了丰富的基础功能:MySQL、PostgreSQL、Redis、超强超好用的自研 ORM、连接池、Web Api、Web MVC、WebSocket、TCP Server、UDP Server、HTTP2、MQTT、gRPC、容器化(Container)、依赖注入、Aop、事件、异步(Async)、缓存(Cache)、命令行(Command)、配置化(Config)、上下文(Context)、定时任务(Cron)、门面(Facade)、验证器(Validate)、锁(Lock)、日志(Log)、定时器(Timer)、权限控制、消息队列(RabbitMQ、Kafka、Redis)、Swagger、Hprose、宏(Macro)、限流、共享内存、Smarty、雪花算法发号器(Snowflake)、Workerman Gateway、InfluxDB 和 TDengine 等组件。
同时,imi 还提供了微服务相关支持:Nacos 配置中心、etcd 配置中心、Nacos 服务注册、Nacos 服务发现、Swoole Tracker、Zipkin、Jaeger、Prometheus、InfluxDB 服务指标监控、TDengine 服务指标监控 和 负载均衡 等组件。
除此之外,imi 还提供了管理后台开发骨架 imi-admin。
imi 框架自 2018 年 6 月 21 日首次发布以来,已经稳定运行在许多项目中,例如文旅电商平台、物联网充电云平台、停车云平台、支付微服务、短信微服务、钱包微服务、卡牌游戏服务端和数据迁移服务(虎扑)等项目。
- 官网:www.imiphp.com/
- Github:github.com/imiphp/imi
- Gitee:gitee.com/yurunsoft/I…
- 技术支持:doc.imiphp.com/v2.1/base/s…