用普通方式请求chatgpt返回数据没啥亮点很简单,但是显然已经不能满足使用时的速度和逼格了
这时候只需要再请求时添加一个参数即可获得openai接口的流式返回了
'stream' => true,
![chatgpt流式返回数据 https://blog.dykyzdh.cn/wp-content/uploads/2023/07/1b7edb3ba5bb5ac7cad3216887f513c-1024x517.png](https://blog.dykyzdh.cn/wp-content/uploads/2023/07/1b7edb3ba5bb5ac7cad3216887f513c-1024x517.png)
这时候需要用到curl的一个选项 CURLOPT_WRITEFUNCTION
CURLOPT_WRITEFUNCTION
是一个 cURL 选项,用于指定一个回调函数,该函数将被 cURL 库调用来处理接收到的响应数据。通过使用 CURLOPT_WRITEFUNCTION
,你可以自定义处理响应数据的方式。
具体怎么用呢:
curl请求openai的代码这里就省略了
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch,$data) { // 在这里处理接收到的响应数据 // $data 参数是接收到的数据 // 可以将数据保存到文件、输出到屏幕等等 echo $data; return strlen($data);//返回接收到的数据长度 }
由于接口返回的数据是一个完整的字符串,所以我们需要处理一下才可以转换成可以操作的数组
// 1、把所有的 'data: {' 替换为 '{' ,'data: [' 换成 '['
$buffer = str_replace('data: {', '{', $buffer);
$buffer = str_replace('data: [', '[', $buffer);
// 2、把所有的 '}\n\n{' 替换维 '}[br]{' , '}\n\n[' 替换为 '}[br]['
$buffer = str_replace("}\n\n{", '}[br]{', $buffer);
$buffer = str_replace("}\n\n[", '}[br][', $buffer);
// 3、用 '[br]' 分割成多行数组
$lines = explode('[br]', $buffer);
然后呢就可以将处理好的数据返回给前端,此时返回的数据是一个字一个字的过去,前端只需要将拿到的数据追加到页面中即可
我这里用的webman框架,前后端通过 webman/push插件进行通信,轻松就将数据推送给前端
后端将数据发送到前端的方式有很多,这里就不作赘述了,最后来看一下效果
![chatgpt流式返回数据 https://blog.dykyzdh.cn/wp-content/uploads/2023/07/2023-07-05-17-51-42_1_-00_00_03-00_00_20.gif](https://blog.dykyzdh.cn/wp-content/uploads/2023/07/2023-07-05-17-51-42_1_-00_00_03-00_00_20.gif)
注:PHP环境需大于8.1