PHP调用大模型API失败主因是鉴权头、请求体结构或响应字段解析错误;需严格设置Authorization和Content-Type头,用json_encode()传索引数组,按平台要求填动态model ID,并优先检查响应体error字段而非仅HTTP状态码。
PHP 调用
大模型
API 不是配个 URL 和 key 就能跑通的事,绝大多数失败都卡在鉴权头、请求体结构或响应字段解析这三处。国产模型尤其容易栽在签名计算、服务 ID 动态性、以及
位置校验上。
curl 发请求时 Authorization 和 Content-Type 缺一不可
OpenAI、豆包、小米 MIXR、通义千问等所有主流接口,都强制要求两个 HTTP 头:
—— token 是字符串,不是数组,不能漏掉
前缀(注意后面有个空格)
—— 漏掉这个头,豆包返回
,通义千问直接
,不是鉴权错
别用
拼 body;必须用
,且确保参数是索引数组(如
),不是关联键名(如
)。
model 参数不是通用名,而是动态服务 ID
豆包的
必须填控制台生成的
开头服务 ID(如
);通义千问要填
或
;智谱 GLM 必须是
这类固定值。传错会直接
或
,不是 token 无效。
立即进入
“
豆包AI人工智官网入口
”;
立即学习
“
豆包AI人工智能在线问答入口
”;
常见错误:
文心大模型
百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作
下载
复制别人文档里的
ID —— 每个账号、每个环境唯一,过期后失效
把飞书登录 Cookie 或网页抓包的临时 token 当作 API Key —— 必须从「字节跳动开放平台 → 我的应用 → 模型服务」里申请
小米 MIXR 的
字段根本不存在 —— 它靠 URL path 区分服务,比如
是错的,实际应走
响应体里 error 字段比 HTTP 状态码更关键
很多接口(尤其是豆包、通义千问)即使返回
,body 里也可能带
字段。只检查
会漏掉真实失败。
务必先
,再判断:
是否存在
—— 豆包常见
或
是否存在
(通义)、
(讯飞)、
(OpenAI)—— 字段路径完全不同,不能硬套
小米 MIXR 响应中
只在
时出现,非流式是
stream=true 在 PHP Web 场景下基本不可用
豆包、通义、讯飞都支持流式,但 PHP-FPM 默认阻塞等待完整响应。设
后不手动处理
,
会卡死或超时。
真要流式输出,得同时满足:
加
防止长连接拖垮 FPM 进程
写
回调,按行解析
前缀,还要处理
、
等 SSE 字段
Nginx 配置
和
,否则前端收不到分块
多数业务场景没必要强求流式 —— 先关掉
,确保
上下文正确、token 有效、响应字段可稳定提取,才是优先级最高的事。
messagesAuthorization: Bearer YOUR_TOKENBearer Content-Type: application/json415 Unsupported Media Type400http_build_query()json_encode()[['role'=>'user','content'=>'hi']]['msg'=>[...]]modelep-ep-20241127160919-2yq8dqwen-maxqwen-longglm-4404 Not Found400 Invalid modelep-model/v1/chat/completions?model=mixr-pro/v1/mixr/pro/chat200 OKerrorcurl_getinfo($ch, CURLINFO_HTTP_CODE)json_decode($response, true)['error']['message']"Invalid model""Rate limit exceeded"['output']['text']['result']['text']['choices'][0]['message']['content']['data']['choices'][0]['delta']['content']stream=true['data']['choices'][0]['message']['content']stream=trueCURLOPT_WRITEFUNCTIONcurl_exec()curl_setopt($ch, CURLOPT_TIMEOUT_MS, 30000)WRITEFUNCTIONdata:event:id:proxy_buffering offchunked_transfer_encoding onstreammessages