Postman与PHP cURL调用OpenAI语音转录API的响应时间差异优化求助
Postman与PHP cURL调用OpenAI语音转录API的响应时间差异优化求助
嘿,我之前也碰到过类似cURL比Postman慢好几倍的情况,咱们一步步来排查和优化:
先排查最容易忽略的隐性耗时:文件读取
你用Postman是直接上传本地文件,而PHP代码是从服务器磁盘读取文件后再发送。这一步的耗时很可能被算进了API调用的总时间里——比如磁盘IO慢、文件权限问题导致读取延迟,甚至文件不存在的隐性报错都可能拖慢整个流程。
建议你在代码里加个计时,看看读取文件到底花了多久:
echo "Start reading file: ". time()."\n"; $filePath = '/var/lib/asterisk/sounds/en/restaurant/'.$voicefile.'.wav'; // 先检查文件是否存在,避免找不到文件的额外耗时 if (!file_exists($filePath)) { die("File not found: $filePath"); } $file = new CURLFILE($filePath); echo "Finished reading file: ". time()."\n";
切换到HTTP/2提升传输效率
Postman默认会使用HTTP/2,而你的代码用的是CURL_HTTP_VERSION_1_1。HTTP/2的多路复用特性能大幅提升和API服务器的通信速度,OpenAI的API也完美支持HTTP/2。把这个参数改成:
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
注意:需要你的服务器上的cURL版本支持HTTP/2,现在大部分主流环境都已经支持了,如果不支持的话建议升级cURL扩展。
优化Header和SSL验证
- 你代码里加了
cache-control: no-cache,但Postman里可能没有这个Header。这个Header可能会让OpenAI的API做额外的缓存校验,先去掉试试。 - 开启
CURLOPT_SSL_VERIFYPEER是生产环境的正确做法,但如果服务器的CA证书不是最新的,验证过程会很慢。可以临时改成false测试(生产环境绝对不能这么做),如果速度变快了,就赶紧更新服务器的CA证书包。
调整cURL连接参数
- 新增
CURLOPT_CONNECTTIMEOUT限制连接阶段的超时时间,避免连接卡住:
CURLOPT_CONNECTTIMEOUT => 5, // 5秒内连接不上就放弃
- 你设置的TCP keepalive参数在某些环境下可能反而会增加延迟,可以先注释掉这些参数测试效果:
// CURLOPT_TCP_KEEPALIVE => 1, // CURLOPT_TCP_KEEPIDLE => 2, // CURLOPT_TCP_KEEPINTVL => 1,
检查PHP和cURL版本
旧版本的PHP cURL扩展可能存在性能瓶颈,建议升级到最新的稳定版(比如PHP 7.4+或者8.x),同时确保cURL版本是7.60以上——这些版本对HTTP/2和传输优化的支持更好。
优化后的完整示例代码
<?php $curl = curl_init(); $voicefile = $argv[1]; $auth = $argv[2]; // 新增:检查文件读取耗时 echo "Start reading file: ". time()."\n"; $filePath = '/var/lib/asterisk/sounds/en/restaurant/'.$voicefile.'.wav'; if (!file_exists($filePath)) { die("File not found: $filePath"); } $file = new CURLFILE($filePath); echo "Finished reading file: ". time()."\n"; curl_setopt_array($curl, array( CURLOPT_URL => 'https://api.openai.com/v1/audio/transcriptions', CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_CONNECTTIMEOUT => 5, // 新增:限制连接超时 CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0, // 修改为HTTP/2 CURLOPT_CUSTOMREQUEST => 'POST', // 暂时关闭keepalive测试 // CURLOPT_TCP_KEEPALIVE => 1, // CURLOPT_TCP_KEEPIDLE => 2, // CURLOPT_TCP_KEEPINTVL => 1, CURLOPT_SSL_VERIFYPEER => true, // 确保CA证书最新 CURLOPT_POSTFIELDS => array( 'model' => 'whisper-1', 'file'=> $file ), CURLOPT_HTTPHEADER => array( 'Authorization: Bearer '.$auth // 移除cache-control header ), )); echo "Seconds before API Call :". time()."\n"; $response = curl_exec($curl); // 新增:检查cURL错误,方便排查问题 if(curl_errno($curl)) { echo 'Curl error: ' . curl_error($curl); } curl_close($curl); echo $response; echo "\n Seconds after API Call:" . time()."\n"; ?>
先从文件读取的排查开始,这个是最常见的“隐性耗时”点,然后再一步步调整其他参数,应该能把响应时间降到和Postman差不多的水平。
备注:内容来源于stack exchange,提问作者VenkataRavi. CR
相关产品推荐
相关产品推荐

