调用AI API前须精确估算token费用并配置cURL超时等防护措施。中文token数远超strlen,需用官方tokenizer库预估;必须设CURLOPT_TIMEOUT等参数防阻塞;429/503优先查配额;批量请求可省70%成本。

PHP里调用AI API前先算清楚单次请求多少钱
很多PHP新手以为“调用个file_get_contents()或curl_init()就完事”,结果月底看到账单懵了——不是API没调通,是根本没预估input_tokens和output_tokens的计费粒度。
主流AI服务商(如OpenAI、Anthropic、阿里云百炼)都按token计费,而PHP里strlen() ≠ token数。中文尤其吃亏:一个汉字通常占2–4个token,取决于模型分词逻辑。
- 实操建议:用官方提供的tokenizer库(如
openai/tokenizer)在PHP里预估,别靠mb_strlen($text, 'UTF8')硬猜 - 测试时加个
echo "est. tokens: " . $estimator->count($prompt);,跑几条典型输入看波动范围 - 注意流式响应(
stream=true)虽然体验好,但token统计更难抓准,建议非必要关掉
用cURL发请求时必须设timeout和max_redirects
AI API响应慢不是小概率事件——模型排队、网络抖动、上游限流都会让curl_exec()卡住几十秒,PHP-FPM进程直接夯住,用户刷新三次,你后台并发涨三倍。
默认cURL没超时,ini_set('default_socket_timeout', 5)对它无效,必须显式配置。
-
curl_setopt($ch, CURLOPT_TIMEOUT, 8):总耗时上限,建议≤10秒(多数场景5–8秒足够) -
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3):连接阶段超时,避免DNS卡死 -
curl_setopt($ch, CURLOPT_MAXREDIRS, 2):防止重定向环,有些AI网关会302跳转到鉴权页 - 别漏掉
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true),否则curl_exec()返回false还查不出错
错误码503/429不是代码bug,是预算或配额触顶
PHP里收到HTTP/1.1 429 Too Many Requests或503 Service Unavailable,第一反应不该是改重试逻辑,而是查账户控制台——是不是免费额度用完了?是不是QPS配额设成5却写了循环调用?
这类错误在开发环境很难复现,因为本地测试请求少;上线后流量一上来就爆。
- 把
http_response_code()和curl_getinfo($ch, CURLINFO_HTTP_CODE)打到日志,区分4xx(你错了)和5xx(它扛不住了) - 对429响应,检查响应头
Retry-After字段,别用固定sleep(1),按头里给的秒数等 - 在关键路径加预算熔断:比如单日调用超5000次,自动切到缓存响应或降级文案,而不是继续发请求烧钱
别在foreach里逐条调AI,批量接口能省70% token和钱
想给10篇文章生成摘要?别写foreach ($articles as $a) { call_ai_summary($a); }——每条都走完整HTTP往返,token重复计算标题/模板文字,模型上下文也没复用。
OpenAI的chat/completions、百炼的/v1/chat/completions都支持messages数组传多轮,只要总token不超模型限制(如gpt-4-turbo是128k),就能一次打包处理。
- 合并提示词:用
"请为以下{$n}篇文章分别生成100字摘要,用JSON格式返回,键名为article_id"+ 批量content - 注意各服务商对batch size的隐性限制(如OpenAI实际建议单次≤20条,再多可能被截断)
- 失败要能定位到哪一条出错,别让整批失败——响应体里
choices[0].message.content结构得提前约定好
最常被忽略的点:token估算必须基于最终发出去的完整messages数组,不是单条文本。少算一个system prompt或换行符,都可能让整批请求因超限被拒。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











