用curl模拟真实请求测ai接口连通性需设8000ms超时、带authorization头、禁用重定向;并发压测用pcntl_fork多进程;须解析json响应体判断rate_limit_exceeded等业务错误;定时任务结果须落盘为唯一命名json文件并单独保存失败原始响应。

用 cURL 模拟真实请求测 AI 接口连通性
AI 接口不稳定,第一反应不是看日志,而是确认它能不能被正常调用。用 PHP 的 cURL 最直接——不依赖框架、不引入额外包,能暴露网络层、TLS、超时等基础问题。
关键不是“发出去”,而是“怎么发才像生产环境”:
-
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 8000)必设,AI 接口响应常在 1–5 秒,设成 30 秒会掩盖超时积压问题 - 必须加
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Authorization: Bearer ' . $token]),漏掉Authorization多数返回401 Unauthorized,但容易误判为服务宕机 - 禁用
CURLOPT_FOLLOWLOCATION,AI 接口重定向通常是配置错误,不该自动跳转
示例片段(只保留核心逻辑):
$ch = curl_init('https://api.example.com/v1/chat/completions');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['model' => 'gpt-4', 'messages' => [['role' => 'user', 'content' => 'hi']]]));
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 8000);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Authorization: Bearer ' . $token]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
批量并发请求识别吞吐瓶颈
单次请求成功 ≠ 稳定。AI 接口在并发下容易出现连接池耗尽、限流触发、内存溢出,得用多进程/多协程压测。
PHP 原生不支持协程,推荐用 pcntl_fork() 启多个子进程,比 file_get_contents 阻塞式轮询更贴近真实负载:
- 每个子进程控制请求数(如 20 次),避免单个进程卡死拖垮全局
- 记录每条请求的
curl_getinfo($ch, CURLINFO_TOTAL_TIME)和CURLINFO_HTTP_CODE,聚合后统计 P95 延迟、错误率 - 别用
sleep()控制频率——它不解决连接复用问题;改用curl_multi_init()批量发起,更准
注意:pcntl 在 Windows 不可用,Docker 容器里需确认 PHP 编译时启用了 --enable-pcntl,否则直接报 Call to undefined function pcntl_fork()。
捕获并分类 AI 接口典型错误响应
AI 接口失败不只返回 5xx,大量业务级错误藏在 200 响应体里,比如:{"error":{"message":"Rate limit reached","type":"rate_limit_exceeded"}} 或 {"choices":[],"usage":{}}(空响应)。
不能只看 HTTP 状态码,必须解析 JSON 并检查字段:
- 先判断
json_last_error() === JSON_ERROR_NONE,防无效 JSON 导致NULL解析结果 - 检查是否存在
error键,再细分type字段:invalid_api_key、context_length_exceeded、server_error - 对
choices数组做isset($data['choices'][0]['message']['content'])断言,空 content 往往意味着模型未生成或被拦截
这类逻辑漏掉,自动化脚本会把“限流”当成“成功”,后续断言全失效。
定时运行 + 结果落盘避免“测了等于没测”
没人盯着的测试等于没做。用系统 cron 跑 PHP 脚本只是第一步,关键是让结果可追溯:
- 每次执行生成唯一文件名,如
ai-stability-20240615-142305.json,内容包含时间戳、请求总数、失败数、最大延迟、首次失败的完整响应 - 失败时用
file_put_contents('last-failed-response.txt', $rawResponse)单独存原始体,方便排查 token 截断、编码异常等问题 - 别用
echo或var_dump输出结果——cron 默认不捕获 stdout,信息直接丢弃
最常被忽略的是时区和日志权限:date('Y-m-d-His') 若服务器时区非 UTC,跨天报告会错乱;写入目录必须确保 PHP 进程用户(如 www-data)有写权限,否则静默失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











