结论:PHP初学者调用AI API失败主因是cURL配置错误、JSON格式不合规及响应处理不当;必设CURLOPT_POST=true、CURLOPT_HTTPHEADER含Authorization和Content-Type、CURLOPT_RETURNTRANSFER=true,json_decode需加true参数,注意空数组、大小写敏感及超时设置。

直接说结论:90%的 PHP 初学者在集成 AI API 时,根本不是卡在“怎么调用”,而是死在 curl_setopt() 没设对、Content-Type 混用、或把 json_decode() 的第二个参数记反了。
PHP cURL 调用 AI API 时 curl_setopt() 必设的三个选项
AI 接口(比如 OpenAI 的 /v1/chat/completions)严格依赖 HTTP 头和请求体格式。只写 curl_setopt($ch, CURLOPT_URL, $url) 是跑不通的。
-
CURLOPT_POST必须显式设为true(哪怕你用CURLOPT_POSTFIELDS);设成1或省略,某些 PHP 版本会发 GET -
CURLOPT_HTTPHEADER至少包含:Authorization: Bearer YOUR_KEY和Content-Type: application/json—— 少任何一个,返回401 Unauthorized或400 Bad Request -
CURLOPT_RETURNTRANSFER必须为true,否则curl_exec()返回bool(true)而不是 JSON 字符串,后续json_decode()直接失败
json_encode() 和 json_decode() 的坑:布尔值、空数组、关联数组
AI 接口要求请求体是标准 JSON 对象(即键名必须字符串),但 PHP 数组太灵活,容易踩雷。
- 传参用
json_encode(['messages' => [['role' => 'user', 'content' => 'hi']], 'model' => 'gpt-3.5-turbo'])—— 没问题 - 但如果
$data = [];然后array_push($data, ...),再json_encode($data),结果是[](JSON 数组),而多数 AI 接口只接受对象{}。解决:强制传关联数组(object) $data或用json_encode($data, JSON_FORCE_OBJECT) -
json_decode($response)默认返回stdClass对象;想用数组访问?必须加第二个参数true,否则$res->choices[0]->message->content会报错Trying to get property 'choices' of non-object
OpenAI 类接口返回 429 或 400 错误时,先查这三个地方
不是密钥错了,也不是网络问题,往往是请求结构本身被服务端拒绝。
立即学习“PHP免费学习笔记(深入)”;
-
429 Too Many Requests:PHP 默认不带User-Agent,部分代理或网关会限流。加一行curl_setopt($ch, CURLOPT_USERAGENT, 'PHP-curl/1.0')能绕过 -
400 Bad Request常见于:messages数组为空、role写成'Role'(大小写敏感)、content是null或空白字符串(需显式过滤trim()) - 响应体里有
"error": {"message": "...", "type": "invalid_request_error"}?别只看 HTTP 状态码,一定要json_decode($response, true)后检查['error']['message']字段 —— 这才是真实原因
最常被忽略的是:PHP 的 max_execution_time 默认 30 秒,而某些 AI 接口响应慢(尤其免费 tier),curl_exec() 超时直接中断,连错误响应都收不到。上线前务必确认 set_time_limit(60) 或在 php.ini 中调高。



















