imi 助力 ChatGPT 應用開發,支援優雅的 SSE 服務端推送功能

宇潤發表於2023-04-30

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-FPMSwooleWorkermanRoadRunner 等多種容器環境下。

imi 提供了豐富的基礎功能:MySQLPostgreSQLRedis超強超好用的自研 ORM連線池Web ApiWeb MVCWebSocketTCP ServerUDP ServerHTTP2MQTTgRPC容器化(Container)依賴注入Aop事件非同步(Async)快取(Cache)命令列(Command)配置化(Config)上下文(Context)定時任務(Cron)門面(Facade)驗證器(Validate)鎖(Lock)日誌(Log)定時器(Timer)許可權控制訊息佇列(RabbitMQ、Kafka、Redis)SwaggerHprose宏(Macro)限流共享記憶體Smarty雪花演算法發號器(Snowflake)Workerman GatewayInfluxDBTDengine 等元件。

同時,imi 還提供了微服務相關支援:Nacos 配置中心etcd 配置中心Nacos 服務註冊Nacos 服務發現Swoole TrackerZipkinJaegerPrometheusInfluxDB 服務指標監控TDengine 服務指標監控負載均衡 等元件。

除此之外,imi 還提供了管理後臺開發骨架 imi-admin

imi 框架自 2018 年 6 月 21 日首次釋出以來,已經穩定執行在許多專案中,例如文旅電商平臺、物聯網充電雲平臺、停車雲平臺、支付微服務、簡訊微服務、錢包微服務、卡牌遊戲服務端和資料遷移服務(虎撲)等專案。

相關文章