运行Google Text-to-Speech API官方PHP代码频繁报错的解决诉求
解决Google Text-to-Speech API多次调用后DNS解析失败的问题
这个问题我之前碰到过好几次,核心是DNS解析临时失效导致Guzzle无法连接到Google的OAuth2服务器,尤其是在连续调用8-10次后容易触发。下面是几个能彻底解决或者缓解这个问题的方案,按优先级排序:
1. 先排查基础网络连通性
首先确认你的机器能稳定解析Google的域名:
- 执行命令测试DNS解析:
nslookup oauth2.googleapis.com,确保能返回有效的IP地址 - 执行命令测试HTTPS连接:
curl -v https://oauth2.googleapis.com/token,确认能正常建立连接
如果这两步有问题,先调整本地DNS服务器(比如换成Google的8.8.8.8或者Cloudflare的1.1.1.1),或者检查防火墙/代理是否限制了对Google服务的访问。
2. 给Guzzle客户端添加重试机制
默认的TextToSpeechClient使用的Guzzle客户端没有配置重试策略,遇到临时DNS错误会直接失败。我们可以手动添加重试中间件,让客户端自动重试这类网络异常:
修改你的客户端初始化代码,添加Guzzle的配置:
use GuzzleHttp\Middleware; use GuzzleHttp\HandlerStack; // 创建重试中间件 $stack = HandlerStack::create(); $stack->push(Middleware::retry(function ($retries, $request, $response, $exception) { // 仅在遇到网络连接异常(包括DNS解析失败)时重试,最多重试3次 if ($exception instanceof \GuzzleHttp\Exception\ConnectException && $retries < 3) { return true; } return false; })); // 初始化TextToSpeechClient时传入Guzzle配置 $client = new TextToSpeechClient([ 'credentials' => '/Documents/gcp_credentials/config.json', 'httpHandler' => $stack ]);
这个配置会让客户端在遇到连接异常时自动重试最多3次,大概率能解决临时网络波动导致的问题。
3. 在业务代码中添加手动重试逻辑
除了Guzzle的全局重试,你还可以在调用synthesizeSpeech的地方添加try-catch块,手动捕获异常并重试:
$maxRetries = 3; $retryCount = 0; $success = false; while (!$success && $retryCount < $maxRetries) { try { $response = $client->synthesizeSpeech($synthesisInputText, $voice, $audioConfig); $audioContent = $response->getAudioContent(); file_put_contents('output.wav', $audioContent); $success = true; echo "语音合成成功\n"; } catch (\GuzzleHttp\Exception\ConnectException $e) { $retryCount++; echo "连接失败,正在重试第{$retryCount}次...\n"; // 重试前等待1秒,避免频繁请求触发限制 sleep(1); } catch (\Exception $e) { // 处理其他异常(比如API配额不足、参数错误等) echo "发生其他错误:{$e->getMessage()}\n"; break; } } if (!$success) { echo "重试{$maxRetries}次后仍失败,请检查网络或API配置\n"; }
4. 调整PHP的DNS缓存设置
PHP默认的DNS缓存时间较短,你可以通过修改配置延长缓存时间,减少重复解析同一个域名的次数:
- 在
php.ini中添加:dns_cache_ttl = 300(缓存5分钟) - 或者在代码开头添加:
ini_set('dns_cache_ttl', 300);
这能降低DNS解析失败的概率,让连续调用更稳定。
内容的提问来源于stack exchange,提问作者kraneee
相关产品推荐
相关产品推荐

