imi 助力 ChatGPT 应用开发,支持优雅的 SSE 服务端推送功能

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 日首次发布以来,已经稳定运行在许多项目中,例如文旅电商平台、物联网充电云平台、停车云平台、支付微服务、短信微服务、钱包微服务、卡牌游戏服务端和数据迁移服务(虎扑)等项目。

你可能感兴趣的:(imi 助力 ChatGPT 应用开发,支持优雅的 SSE 服务端推送功能)