php 7.3调用通义千问api中文截断主因是字符处理、响应解析或参数配置不当:须用mb_substr(..., 'utf-8')避免字节截断,确保curl_exec一次性读全响应,且max_tokens设为512以上防服务端强制截断。

PHP 7.3 调用通义千问 API 出现中文输出截断,通常不是模型本身限制,而是 PHP 层面的字符处理、HTTP 响应解析或编码配置不当导致。重点排查以下三类环节:
检查响应体解码与字符串截取逻辑
通义千问 API 返回的是 UTF-8 编码的 JSON,若 PHP 中误用 substr() 或 mb_substr() 参数错误,极易在中文中间截断(一个中文占 3 字节,substr() 按字节切会破坏 UTF-8 结构)。
- 务必用
mb_substr($str, 0, $len, 'UTF-8')替代substr() - 解析 JSON 后,检查
$response['output']['text']是否完整;不要在未确认长度时就做mb_substr(..., 0, 100)这类硬截断 - 调试时可先用
var_dump(mb_strlen($text, 'UTF-8'))和strlen($text)对比,确认是否为多字节处理问题
验证 HTTP 客户端响应流完整性
使用 cURL 或 Guzzle 时,若未正确设置超时、缓冲或未读取完整 body,可能只拿到部分响应(尤其大段中文生成时)。
- cURL 需确保
CURLOPT_RETURNTRANSFER => true,且不设CURLOPT_HEADER干扰 body 解析 - 避免使用
fgets()或分块读取而未循环到底;推荐一次性curl_exec()获取完整响应 - 检查返回状态码和
Content-Length头,对比实际响应体长度是否匹配
确认 DashScope SDK 或 OpenAI 兼容接口的参数配置
截断常源于服务端提前终止生成,而非传输问题。需检查请求中是否无意触发了长度限制:
-
max_tokens设置过小(如仅设 64),会导致中文输出被强制截断;建议根据预期内容设为 512 或更高 - 使用 DashScope SDK 时,确认未开启
stream: true却按非流式方式处理——流式响应需逐 chunk 拼接,否则首 chunk 后即丢失后续 - 若用 OpenAI 兼容接口,注意
stop参数是否填入了中文标点(如“。”),可能意外提前终止
只要把字符编码、响应读取、生成参数这三处对齐,中文截断问题基本能定位解决。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











