PHP调用Google Distance Matrix API返回空值问题求助
问题原因及解决办法
一、代码本身的问题
- $wayTo的编码处理错误:你对
$wayTo用了urldecode,但如果$wayTo原本不是URL编码后的内容,解码后会出现乱码或非法字符,导致拼接出的URL无效。浏览器直接访问用的是正确编码的地址,所以能正常请求。应该把urldecode($wayTo)改成urlencode($wayTo),和$wayFrom的处理保持一致。 - 错误被屏蔽无法排查:你在
file_get_contents前加了@符号,会把所有错误提示都屏蔽掉,根本看不到到底哪里出问题。先把@去掉,同时开启PHP错误提示,就能看到具体报错:ini_set('display_errors', 1); ini_set('error_reporting', E_ALL); $out = file_get_contents($url);
二、服务器环境的限制
- allow_url_fopen未开启:PHP的
allow_url_fopen配置如果是关闭状态,file_get_contents就没法请求外部URL。可以用phpinfo()查看这个配置,要是关着,就在php.ini里改成allow_url_fopen = On,或者找主机商帮忙开启。 - 服务器网络限制:服务器可能有防火墙规则,阻止PHP脚本发起对外请求,或者需要走代理才能访问外部API。浏览器访问走的是你本地网络,不受服务器规则限制,所以能成功。这种情况可以找服务器管理员排查网络规则,或者换用cURL替代
file_get_contents(cURL一般不受allow_url_fopen限制):$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 若服务器SSL验证有问题可临时关闭下面这行,正式环境建议开启 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $out = curl_exec($ch); curl_close($ch); - 缺少User-Agent被拦截:Google API可能会拒绝没有User-Agent标识的请求,浏览器访问时有默认的User-Agent,而
file_get_contents默认没有。可以手动添加User-Agent:$opts = [ 'http' => [ 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\r\n" ] ]; $context = stream_context_create($opts); $out = file_get_contents($url, false, $context);
三、API密钥的限制问题
你在Google Cloud控制台可能给API密钥设置了应用限制,比如只允许特定IP或HTTP referrer访问。浏览器访问时的IP或referrer符合规则,但服务器的公网IP不在允许列表里,所以脚本请求被拒绝。去Google Cloud的API密钥设置页面,把服务器的公网IP添加到允许列表即可。
内容的提问来源于stack exchange,提问作者Zeno
相关产品推荐
相关产品推荐

