imi v2.1.45 釋出,支援優雅的 SSE 服務端推送功能,文件:https://doc.imiphp.com/v2.1/components/httpserver/sse.html
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 日首次釋出以來,已經穩定執行在許多專案中,例如文旅電商平臺、物聯網充電雲平臺、停車雲平臺、支付微服務、簡訊微服務、錢包微服務、卡牌遊戲服務端和資料遷移服務(虎撲)等專案。