应使用 composer require openai-php/client 安装由 spiral 团队维护的主流 SDK,PHP 版本需 ≥ 8.0;apiKey 必须为原始字符串(如 sk-xxx),不可带 Bearer 前缀;messages 参数必须为关联数组,每个元素含 role 和 content;开发环境遇 SSL 错误可临时设 verify => false,但生产环境严禁。

直接用 composer require 安装官方 OpenAI PHP SDK 就行,但别装错包
OpenAI 官方没有维护 PHP SDK,目前最主流、更新活跃、文档较全的是 openai-php/client(由 spiral 团队维护)。很多人搜 “openai php sdk” 会误装过时或无人维护的包(比如已归档的 openai-php/openai),结果调不通或报 Class not found。
正确命令是:
composer require openai-php/client
它依赖 php-http/guzzle7-adapter 和 psr/http-client,Composer 会自动拉取兼容的 HTTP 客户端。PHP 版本需 ≥ 8.0 —— 如果你用 PHP 7.4,会安装失败并提示 Your requirements could not be resolved。
- 别手贱改
composer.json手动加旧包名,比如openai/openai,那个库早在 2022 年就停止维护了 - 装完检查
vendor/openai-php目录是否存在,不存在说明没装成功 - 如果项目用了 Laravel,不需要额外适配;纯 PHP 脚本也完全可用,无框架耦合
初始化 Client 必须传 apiKey,且不能带 Bearer 前缀
实例化 OpenAI\Client 时,apiKey 是必填项,格式必须是原始密钥字符串(如 sk-xxx),不是带 Bearer 的完整 Authorization 字符串。否则会收到 401 Unauthorized,错误信息里可能只显示 Incorrect API key provided,容易误判为密钥本身错了。
立即学习“PHP免费学习笔记(深入)”;
示例代码:
$client = \OpenAI\Client::builder()
->withApiKey($_ENV['OPENAI_API_KEY']) // ← 这里只传 sk-xxx,不要加 Bearer
->build();
-
$_ENV要提前通过.env或putenv()加载,别硬编码在代码里 - 如果用 Docker,确保
OPENAI_API_KEY已注入容器环境变量 - 密钥泄露风险高,千万别提交到 Git —— 检查
.gitignore是否包含.env
调用 chat()->create() 时,messages 是数组,不是 JSON 字符串
常见错误是把整个请求体当 JSON 字符串拼好再传进去,比如:
// ❌ 错误写法:传字符串
$client->chat()->create('{"model":"gpt-3.5-turbo","messages":[{"role":"user","content":"Hi"}]}');
这会触发 TypeError: Argument 1 passed to OpenAI\Resources\Chat::create() must be of the type array。正确方式是传原生 PHP 关联数组:
$response = $client->chat()->create([
'model' => 'gpt-3.5-turbo',
'messages' => [
['role' => 'user', 'content' => 'Hello'],
],
]);
-
messages数组里每个元素都必须含role和content,role只能是user、assistant或system - 不支持
stream => true的流式响应(v0.8.0 之前),要流式得手动换底层 HTTP 客户端或等新版 - 返回的
$response->choices[0]->message->content是字符串,不是对象嵌套链 —— 记得加空值判断,避免Trying to access array offset on value of type null
遇到 cURL error 60 或 SSL 验证失败,优先关掉 verify(仅开发环境)
在某些内网或旧系统(如 CentOS 6 + OpenSSL 1.0.1)上,执行时可能报:
cURL error 60: SSL certificate problem: unable to get local issuer certificate
这不是 SDK 问题,是 Guzzle 底层 HTTPS 验证失败。生产环境应更新 CA 证书,但开发调试时可快速绕过:
$client = \OpenAI\Client::builder()
->withApiKey($_ENV['OPENAI_API_KEY'])
->withHttpClient(new \GuzzleHttp\Client([
'verify' => false, // ← 仅限本地/测试环境!
]))
->build();
- 永远不要在生产环境设
verify => false,否则中间人攻击风险极高 - 更安全的临时方案:下载最新
ca-bundle.crt,配置'verify' => '/path/to/cacert.pem' - Windows 上 Composer 自带的 cURL 有时也抽风,可改用 WSL2 环境跑 PHP 脚本避开
messages 类型和 apiKey 前缀上反复试错,建议先复制粘贴最小可运行示例跑通,再逐步加逻辑。











