阿里云未提供官方PHP SDK调用通义千问API,需用cURL或file_get_contents直连dashscope REST API;API Key须在DashScope控制台单独创建且以sk-开头;请求头必含Authorization、Content-Type和User-Agent;域名固定为https://dashscope.aliyuncs.com。

阿里云 PHP SDK 安装失败或 require 报错
官方未提供独立的 PHP SDK 用于调用通义千问(Qwen)API,直接安装 aliyun-openapi-php-sdk 或搜 qwen php sdk 会找不到合法包。阿里云目前只支持通过 OpenAPI 方式调用 Qwen 系列模型,即:自己构造 HTTP 请求,而非调用封装好的 QwenClient 类。
常见错误包括:Class 'AlibabaCloud\Client\AlibabaCloud' not found(误用了旧版阿里云通用 SDK)、Failed to open stream: No such file(手动下载 SDK 但未正确 autoload)。
- 别去 Packagist 搜
qwen或dashscope的 PHP 包——不存在官方维护版本 - 不要尝试用
composer require alibabacloud/openapi后直接 new QwenClient——类根本不存在 - 真正可用路径是:使用
dashscope提供的 REST API + PHP 原生cURL或file_get_contents发起请求
dashscope API Key 配置与鉴权失败
通义千问 API 由阿里云 dashscope 平台托管,PHP 调用必须在请求头中携带 Authorization: Bearer <api_key>,且需指定 Content-Type: application/json。漏掉任一字段都会返回 401 Unauthorized 或 400 Bad Request。
注意:api_key 不是阿里云主账号 AK/SK,必须单独在 DashScope 控制台 创建,路径为「API Key 管理」→「创建新的 API Key」。
立即学习“PHP免费学习笔记(深入)”;
-
api_key必须以sk-开头,长度约 40 位;若以LTAI开头,说明你拿错了阿里云 RAM AK,不能用 - 请求域名固定为
https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation,写错子域名(如dashscope.aliyun.com)会 DNS 解析失败 - 务必在请求头中设置
User-Agent: aliyun-dashscope-php(非强制但部分环境会拦截无 UA 请求)
发起一次基础对话请求的最小可行代码
以下是最简可运行示例,不依赖任何第三方 SDK,仅用 PHP 原生 cURL。它向 qwen-max 模型发送单轮提问,获取生成结果:
<?php
$api_key = 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; // 替换为你自己的 DashScope API Key
$url = 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation';
$data = [
'model' => 'qwen-max',
'input' => [
'messages' => [
['role' => 'user', 'content' => '用 Python 写一个计算斐波那契数列前 10 项的函数']
]
],
'parameters' => [
'result_format' => 'message'
]
];
$options = [
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $api_key,
'Content-Type: application/json',
'User-Agent: aliyun-dashscope-php'
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30
];
$ch = curl_init();
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code === 200) {
$result = json_decode($response, true);
echo $result['output']['choices'][0]['message']['content'] ?? '无返回内容';
} else {
echo "HTTP {$http_code}: " . $response;
}
?>
关键点:messages 是数组,即使单轮也必须包裹;result_format 设为 message 才能拿到结构化输出;qwen-max 是当前最强通用模型,若想省钱可换 qwen-plus 或 qwen-turbo,但需确认控制台已开通对应权限。
处理流式响应(stream=true)和超时问题
当设置 "stream": true 时,API 返回的是 SSE(Server-Sent Events)格式数据流,每行以 data: 开头,PHP 默认 cURL 无法自动解析。强行读取会卡住或截断。
- 不建议在 Web 场景下启用
stream:PHP-FPM 通常有 30 秒执行上限,而流式响应可能持续更久,导致超时中断 - 若真要流式,需禁用
CURLOPT_RETURNTRANSFER,改用CURLOPT_WRITEFUNCTION逐块接收并解析data:行,还要手动处理[DONE]结束标识 - 生产环境建议设
"max_tokens": 1024限制输出长度,避免模型陷入长生成导致超时 - 遇到
cURL error 28: Operation timed out,优先调大CURLOPT_TIMEOUT至 60,而非盲目开流式
模型响应延迟受输入长度、服务器负载影响较大,首次调试建议用短提示(如“你好”),确认链路通了再加复杂逻辑。











