用thinkphp+js模拟ChatGPT逐字打印的效果踩坑指南

这篇具有很好参考价值的文章主要介绍了用thinkphp+js模拟ChatGPT逐字打印的效果踩坑指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近对ChatGPT里逐字输出的效果很感兴趣,起初以为是接口内容返回之后使用css+js实现的纯前端效果,深入一调研发现用的是Server-Sent Events(SSE)数据流实现的,看了sse的基本原理之后,就开始上手测试了,结果碰到一个小坑,卡了很久,这里分享一下:
直接问ChatGPT用thinkPHP如何实现SSE,会得到如下代码:
在控制器方法中侦听事件源,并将数据输出到客户端。以下是输出要实时推送的事件的示例代码:
【不正确示例】

public function stream() {
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    header('Connection: keep-alive');
    // 建立连接后,您可以输出初始化数据到客户端
    echo "event: sse_init\ndata: {}\n\n";
    flush();
    
    // 监听事件源,并输出实时事件
    while (true) {
        $event = 'my_event';
        // 获取要发送的事件数据
        $data = 'Hello SSE!';
        // 输出事件到客户端
        echo "event: $event\ndata: $data\n\n";
        flush();
        // 休眠一段时间等待下次事件
        sleep(1);
    }
}

上述代码会不断地监听 “my_event” 事件源,并将数据 “Hello SSE!” 输出到客户端。在每个事件发送之间,脚本会等待一秒钟以模拟实时数据流。

也可以用thinkPHP的标准返回方法:
【不正确示例】

public function stream() {
    $response = new Response();
    $response->header('Content-Type', 'text/event-stream');
    $response->header('Cache-Control', 'no-cache');
    $response->header('Connection', 'keep-alive');
    // 建立连接后,您可以输出初始化数据到客户端
    $response->data("event: sse_init\n");
    $response->data("data: {}\n\n");
    // 监听事件源,并输出实时事件
    $count = 0;
    while (true) {
        $event = 'my_event';
        // 获取要发送的事件数据
        $data = 'Hello SSE! ' . ++$count;
        // 输出事件到客户端
        $response->data("event: $event\n");
        $response->data("data: $data\n\n");
        $response->send();
        // 休眠一段时间等待下次事件
        sleep(1);
    }
}

然后在前端用js接收事件流:

var source = new EventSource("<?php echo url('stream'); ?>");
source.addEventListener('my_event', function(event) {
    console.log(event.data);
});

然后就会发现,并没有期待的效果出现,并且浏览器会报错:
EventSource's response has a MIME type ("text/html") that is not "text/event-stream". Aborting the connection.
这个问题卡了很久,PHP中已经设置了响应格式为text/event-stream,但是浏览器接收到的仍然是text/html格式,好像$response->header('Content-Type', 'text/event-stream');这句代码没有生效一样;
后来经过多方调查,ThinkPHP使用了数据缓冲来输出内容,这会导致有些响应格式没有生效,所以在上面的PHP代码中添加ob_end_clean();可以解决问题。
还有朋友会遇到一切看似正常,没有报错,返回头也是text/event-stream,但返回的事件流不是实时的,而是等很久最后一次性输出所有事件流,原因后面再说,先给出正确代码:
【正确示例】

public function stream() {
	// 检查当前缓冲区级别
    if (ob_get_level() > 0) {
    	// 如果有缓冲区,则清空缓冲区
        ob_end_clean(); 
    }
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    header('Connection: keep-alive');
    // 重点,必须要加
    header('X-Accel-Buffering: no');
    // 建立连接后,您可以输出初始化数据到客户端
    echo "event: sse_init\ndata: {}\n\n";
    flush();

    // 监听事件源,并输出实时事件
    while (true) {
        $event = 'my_event';
        // 获取要发送的事件数据
        $data = 'Hello SSE!';
        // 输出事件到客户端
        echo "event: $event\ndata: $data\n\n";
        flush();
        // 休眠一段时间等待下次事件
        sleep(1);
    }
}

解释一下上面代码:
一开始的ob_end_clean()方法是清除之前的缓冲区域,使设置的返回头header('Content-Type: text/event-stream');生效,不然还会返回text/html格式,最终导致报错;
然后设置请求头,其他都好理解,重点是这句header('X-Accel-Buffering: no');,这段代码是强制关闭Nginx的代理缓存,其实也是关闭缓冲区域,不加这句话就会出现事件流最后一次性输出的问题;
然后就是使用echo+flush()方法向外输出事件流了,每次echo后面都要加上flush(),强制输出事件流;

最后还有个大坑,不要用Apache,要用Nginx,似乎是因为Apache对flush()方法支持有问题,无论怎么搞,最终还是一次性输出事件流;文章来源地址https://www.toymoban.com/news/detail-435725.html

到了这里,关于用thinkphp+js模拟ChatGPT逐字打印的效果踩坑指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • java集成chatGpt完整案例代码(效果和官网一样逐字输出)

    java集成chatGpt完整案例代码(效果和官网一样逐字输出)

    背景 要集成chatGpt参考我上一篇文章即可。但是,如果要实现官网一样的效果,逐字输出,难度就提升了不少了。经过在官网的研究发现它应该是采用了SSE技术,这是一种最新的HTTP交互技术。SSE(Server-Sent Events):通俗解释起来就是一种基于HTTP的,以流的形式由服务端持续向客户

    2024年02月08日
    浏览(13)
  • chatgpt 逐字输出 使用fetch/eventSource/fetchEventSouce进行sse流式处理

    chatgpt 逐字输出 使用fetch/eventSource/fetchEventSouce进行sse流式处理

    前端使用vue 先贴最后成功使用的 使用fetchEventSource方法 参考代码:https://blog.csdn.net/cuiyuchen111/article/details/129468291 参考/下载文档:https://www.npmjs.com/package/@microsoft/fetch-event-source?activeTab=readme 以下为后端接口要求 前端代码 遇到的问题: 1.只调用一次事件 但fetch请求发送了两次或

    2024年02月07日
    浏览(14)
  • ASP.NET Core Web API 流式返回,实现ChatGPT逐字显示

    ASP.NET Core Web API 流式返回,实现ChatGPT逐字显示

    🏆作者:科技、互联网行业优质创作者 🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 🏆欢迎关注我(Net数字智慧化基地),里面有很多 高价值 技术文章, 是你刻苦努力也积累不到的经验 ,能助你快速成长。升职

    2024年02月22日
    浏览(18)
  • 全新UI基于Thinkphp的最新自助打印系统/云打印小程序源码/附教程

    全新UI基于Thinkphp的最新自助打印系统/云打印小程序源码/附教程

    这是一款全新的基于Thinkphp的最新自助打印系统,最新UI界面设计的云打印小程序源码,带有简单的教程。 源码下载:YISHEN源码网(ms3.ishenglu.c)om 

    2024年01月25日
    浏览(11)
  • 快!体验文心一言;ChatGPT关键词优化指南;Midjourney从入门到精通;AI绘画资料合集;Midjourney v5效果相当不错 | ShowMeAI日报

    快!体验文心一言;ChatGPT关键词优化指南;Midjourney从入门到精通;AI绘画资料合集;Midjourney v5效果相当不错 | ShowMeAI日报

    👀 日报合辑 | 🎡 生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 文心一言正式发布,普通的对话效果好于预期,高级的 prompt engineering 编程能力还没支持。作为一个开端,相当不错。参与方式见图。 来了来了!3月16日 🌍 微软宣布正式为 Microsoft 365 应用和服务提供

    2024年01月22日
    浏览(13)
  • 微信小程序给 thinkphp后端发送请求出现错误 Wrong number of segments 问题的解决 【踩坑记录】

    微信小程序给 thinkphp后端发送请求出现错误 Wrong number of segments 问题的解决 【踩坑记录】

    这里提示 wrong number of segements , 百度了一下说这个问题是 后端解码token缺了一些东西(没正确的解码),然后我去抓了下包发现,我小程序端发送请求的时候,token是undifend,然后检查了一下store中的token发现,是我写错了变量名(😂好低级的错误) 微信小程序向后端发送请求时

    2024年02月09日
    浏览(14)
  • 使用css3如何实现一个文字打印效果

    使用css3如何实现一个文字打印效果

    在很多网站首页介绍页里,为了吸引用户,暂留更长时间,使用了一些css3动画的 文字打印.gif 想要实现这个动画,改变元素的宽度,结合动画css3关键帧实现 animation 动画通过设置多个节点来精确控制一个或者一组动画,常用来实现复杂的动画效果; 相对过渡动画, animation 动画可以

    2024年02月16日
    浏览(94)
  • flinkcdc踩坑指南

    flinkcdc踩坑指南

    Flink CDC 常用两种方式进行数据的全量+增量一体的数据同步,数据清洗等功能。主要使用方法: 使用 DataStream API 进行任务的逻辑实现 使用 Flink SQL 的方式进行任务的提交 解决方案: 采用此方式,如有缺少其他依赖报错,应将依赖包放到flink/lib下,且注意配置flink环境变量 解

    2024年03月19日
    浏览(9)
  • Nginx踩坑指南

    Nginx踩坑指南

    参考链接: http://nginx.org/en/linux_packages.html 3.1 问题1 答案: 这不是一个nginx配置文件,而是一个vhost配置文件,应该放在 /etc/nginx/conf.d (或者 /etc/nginx/sites-enabled ,如果您喜欢这种类型的vhost配置文件组织;请查看sites-available与sites-enabled与conf.d目录thread在ServerFault中的差异,以

    2024年02月08日
    浏览(9)
  • Autoware 安装(踩坑指南)

    Autoware 安装(踩坑指南)

    【Autoware】2小时安装Autoware1.13(保姆级教程) Autoware入门学习(二)——Ubuntu18.04下的源码安装和配置 上面的两篇博客安装都异常顺利,甚至没有一点报错,实际安装中显然是不可能的 安装环境 Ubuntu 18.04 ROS Melodic Qt 5.10.0 OpenCV 3.4.16 看一下官网的 Requirements 这里 CUDA 是选装的

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包