如何将CURLOPT_WRITEFUNCTION返回的流数据转为数组/JSON并提取content字段
解决方案
你拿到的返回内容是**Server-Sent Events(SSE)**格式的数据流,每块数据以data: 开头,后面跟着JSON内容,只需修改回调函数,按步骤处理即可:
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch, $data) { // 1. 清理数据:移除开头的"data: ",同时去掉多余空白字符 $cleanData = trim(str_replace('data: ', '', $data)); // 2. 跳过流结束标记(部分接口会返回[data: [DONE]]) if ($cleanData === '[DONE]') { return strlen($data); } // 3. 将清理后的字符串解析为关联数组 $jsonArray = json_decode($cleanData, true); // 4. 校验结构后提取content字段 if (is_array($jsonArray) && isset($jsonArray['choices'][0]['delta']['content']) ) { $content = $jsonArray['choices'][0]['delta']['content']; // 这里可根据需求处理content,比如直接输出: echo $content; } return strlen($data); });
关键细节:
- 实时流是分块返回的,每次回调的
$data是一小段内容,必须逐块清理前缀 json_decode第二个参数设为true,会把JSON转为关联数组,方便直接取值- 要判断
delta下是否存在content字段,部分流块可能仅包含元数据或结束标记 - 如果你之前添加的
str_repeat(' ',1024*8)是为了强制输出缓冲,可按需保留(比如放到echo $content后)
内容的提问来源于stack exchange,提问作者Ondraasek
相关产品推荐
相关产品推荐

