DVLA API本地正常 部署至生产服务器后连接失败求助
排查Krystal主机上WordPress代理插件无法连接DVLA API的问题
根据你描述的情况,核心问题是生产服务器上Curl无法建立到DVLA API的443端口连接,超时报错。本地环境正常说明代码逻辑没问题,问题大概率出在生产服务器的网络配置或SSL环境上,以下是具体排查和修复步骤:
1. 验证服务器出站443端口是否真的开放
虽然主机商说已配置,但实际连接失败可能是防火墙/安全组未放行。你可以:
- 通过SSH登录服务器,执行命令测试直接连接:
curl -v https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles - 如果没有SSH权限,可以在插件代码里临时添加这段命令的执行逻辑,捕获输出日志:
$test_output = shell_exec('curl -v https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles 2>&1'); error_log('DVLA API test output: ' . $test_output);
如果测试结果显示连接被拒绝/超时,直接反馈给主机商,要求他们确认出站443端口的放行状态。
2. 检查Curl的SSL证书配置
部分主机的Curl环境可能缺少正确的CA根证书,导致SSL握手失败(错误提示可能显示为连接失败,但实际是SSL层面的问题)。你可以:
- 在Curl请求中强制指定WordPress自带的CA证书路径:
curl_setopt($ch, CURLOPT_CAINFO, ABSPATH . WPINC . '/certificates/ca-bundle.crt'); - 临时关闭SSL验证(仅用于测试,生产环境不要保留),确认是否是证书问题:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
如果关闭SSL验证后能正常连接,说明是CA证书配置问题,保留指定CA证书的代码即可。
3. 优化Curl超时参数
当前超时时间过长(132秒),设置更合理的超时能更快定位问题,同时避免用户长时间等待:
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 连接超时10秒 curl_setopt($ch, CURLOPT_TIMEOUT, 20); // 整个请求的总超时20秒
4. 确认是否需要配置出站代理
有些主机商会要求所有出站请求通过内部代理服务器,你需要联系主机商确认:
- 代理服务器地址和端口
- 是否需要用户名/密码认证
如果需要,在Curl中添加代理配置:
curl_setopt($ch, CURLOPT_PROXY, '代理地址'); curl_setopt($ch, CURLOPT_PROXYPORT, 代理端口); // 若需要认证 curl_setopt($ch, CURLOPT_PROXYUSERPWD, '用户名:密码');
5. 检查DVLA API的IP访问限制
DVLA API可能对陌生IP有访问拦截,你可以:
- 登录DVLA开发者后台,查看是否有IP白名单设置,将生产服务器的IP添加进去
- 联系DVLA技术支持,确认你的服务器IP是否被列入拦截列表
调整后的插件代码示例
结合以上优化点,你的Curl请求代码可以修改为:
function dvla_proxy_request($vehicle_data) { $api_url = 'https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles'; $api_key = '你的API密钥'; $ch = curl_init($api_url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($vehicle_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置超时参数 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 20); // 指定WordPress自带CA证书 curl_setopt($ch, CURLOPT_CAINFO, ABSPATH . WPINC . '/certificates/ca-bundle.crt'); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'x-api-key: ' . $api_key )); $response = curl_exec($ch); if(curl_errno($ch)) { $error_msg = 'Curl错误(' . curl_errno($ch) . '): ' . curl_error($ch); error_log($error_msg); // 调试阶段可以返回具体错误,生产环境替换为自定义提示 // return $error_msg; return 'failed to retrieve data'; } curl_close($ch); return $response; }
内容的提问来源于stack exchange,提问作者user3512002
相关产品推荐
相关产品推荐

