商城首页欢迎来到中国正版软件门户

您的位置:首页 >PHP与阿里云通义千问集成_PHP调用Qwen模型【方法】

PHP与阿里云通义千问集成_PHP调用Qwen模型【方法】

  发布于2026-05-02 阅读(0)

扫一扫,手机访问

PHP调用通义千问需直连DashScope REST API,用cURL或file_get_contents发送带Authorization和Content-Type头的JSON请求;API Key须在DashScope控制台单独创建,格式为sk-xxx;请求地址为https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation;body中model、input.messages(数组)、parameters为必填;流式响应需用CURLOPT_WRITEFUNCTION逐行解析data:前缀的JSON Lines;错误信息藏在响应体message字段中,非HTTP状态码。

PHP与阿里云通义千问集成_PHP调用Qwen模型【方法】

如果你打算在PHP项目里集成通义千问模型,首先得明确一点:目前并没有官方的PHP SDK。这意味着,你得直接通过HTTP请求去调用DashScope的REST API。听起来有点麻烦?其实核心就两步:用cURL或者file_get_contents发起一个POST请求,并且在请求头里正确带上你的API密钥。这里有个小建议,别花时间去搜索类似composer require qwen这样的包——它根本不存在,直接上手调用API才是正解。

怎么拿到能用的 API Key

第一步,也是关键一步,是获取正确的API Key。这里有个常见的误区:这个Key并不是你阿里云主账号的那个以LTAI开头的AccessKey。你必须单独去DashScope控制台创建:

  • 打开DashScope控制台,找到「API Key 管理」页面,然后点击「创建新的 API Key」。
  • 生成的密钥会以sk-开头,长度大约40位。注意,这个密钥只显示一次,务必当场复制并妥善保存。
  • 安全起见,不要把这个密钥硬编码在你的PHP源码里。推荐的做法是使用环境变量,比如通过$_ENV[‘DASHSCOPE_API_KEY’]或者getenv(‘DASHSCOPE_API_KEY’)来读取。
  • 另外需要注意,如果你是从百炼控制台(bailian.console.aliyun.com)申请的Key,需要确认它已经开通了DashScope的调用权限,否则很可能会遇到403 Forbidden的错误。

请求地址和 header 怎么写才不报 401/400

构造请求时,域名、路径和请求头这三者,缺一不可,任何一个细节出错都可能导致调用失败:

  • 请求地址是固定的:https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation。请留意,这里是aliyuncs.com,不是常见的aliyun.com
  • 请求头(Header)里必须包含两项:
    • Authorization: Bearer sk-xxx(将sk-xxx替换为你的真实密钥)
    • Content-Type: application/json
  • 建议额外加上一个User-Agent头,例如User-Agent: aliyun-dashscope-php,因为有些服务器配置会拦截没有User-Agent的请求。
  • 这里有两个典型的错误对照:如果漏掉了Content-Type,通常会返回400 Bad Request;如果Authorization头的格式不对(比如忘记了Bearer 这个前缀和空格),那么迎接你的就是401 Unauthorized

POST body 结构和 model 参数怎么配

请求体(Body)的构造需要根据你调用的具体模型来调整,比如qwen-maxqwen-long的格式要求就可能不同,不能混用:

立即学习“PHP免费学习笔记(深入)”;

  • 对于qwen-max这类模型,请求体中的input.messages需要是一个数组。数组里的每个元素都是一个对象,包含role(取值如userassistant)和content(字符串)这两个字段。
  • 而像qwen-long这样的模型,在部分接口(例如兼容模式)下,虽然也要求messages是类似的结构,但响应的字段路径可能有所不同,可能是output.choices[0].message.content,而不是简单的output.text
  • 无论如何,有几个字段是必须填写的:model(指定模型名称,如"qwen-max")、input(里面包含messages数组)、以及parameters(即使没有额外参数,也需要传一个空对象{}或PHP的new stdClass())。
  • 开发过程中,有几个高频错误值得警惕:把messages误写成了对象而不是数组、role字段名拼写错误(比如首字母大写成了Role)、或者content传了空字符串,这些都可能导致接口返回400错误。

流式输出(SSE)怎么接住 chunk 数据

当你启用了流式输出(在参数中设置"stream": true),服务器返回的数据就不再是一个完整的JSON,而是一系列分块的JSON Lines格式数据(每行是一个独立的JSON对象)。这时候,你不能再用json_decode(file_get_contents(...))这种一次性处理的方式了:

  • 你必须使用cURL库,并设置CURLOPT_WRITEFUNCTION回调函数,来逐块接收和处理数据。
  • 每一块数据通常以data: { ... }这样的格式开头。你需要手动剥离掉前面的data: 前缀,然后再对剩余的部分进行json_decode($line, true)解码。
  • 解码后,关键的内容字段通常在choices[0].delta.content里(注意,这里不是message字段)。另外需要注意,第一个数据块可能只包含idobject等元信息,content字段可能是空的。
  • 如果你是在Web环境下希望浏览器能实时显示这些数据,别忘了在回调函数中适时调用ob_flush(); flush();来刷新输出缓冲区。

最后,还有一个极其重要但容易被忽略的细节:DashScope API的错误信息,并不体现在HTTP状态码的文字描述里,而是全部封装在响应体的message字段中。这意味着,即使请求返回了HTTP 200状态码,响应体里也可能包含"success": false以及具体的失败原因。因此,在处理响应时,一定要先检查$response[‘error’]或者$response[‘message’]字段,才能准确判断和定位问题所在。

本文转载于:https://www.php.cn/faq/2341416.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注