You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:17:05