PHP通过file_get_contents调用Geocode API返回NULL,浏览器调用正常
问题分析与解决办法
这几乎不可能是Google Geocode API的Bug,问题大概率出在PHP请求的配置或环境上,下面是具体的排查方向和解决方法:
请求头缺失导致被拦截
浏览器发起请求时会自动携带User-Agent等标识头,而file_get_contents默认的请求头没有这些信息,容易被Google的反爬机制识别为非合法请求,从而被拦截。
解决办法:给请求添加模拟浏览器的请求头,示例代码:$url = "https://maps.googleapis.com/maps/api/geocode/json?address=306+Pineland+place%2CCalgary%2CAB%2CT1Y+3C5%2CCanada&key=__MYAPIkey_"; $context = stream_context_create([ 'http' => [ 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36\r\n" ] ]); $response = file_get_contents($url, false, $context); var_dump($response);PHP配置限制
allow_url_fopen
如果你的PHP环境中allow_url_fopen被禁用,file_get_contents将无法访问远程URL。这种情况下,推荐使用curl替代,它不受该配置限制且更稳定:$url = "https://maps.googleapis.com/maps/api/geocode/json?address=306+Pineland+place%2CCalgary%2CAB%2CT1Y+3C5%2CCanada&key=__MYAPIkey_"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"); $response = curl_exec($ch); curl_close($ch); var_dump($response);URL编码不规范
即使使用了urlencode,如果是对地址的部分内容编码而非整体,可能会出现编码冲突。正确的做法是对整个地址字符串进行编码后再拼接URL:$rawAddress = "306 Pineland place,Calgary,AB,T1Y 3C5,Canada"; $encodedAddress = urlencode($rawAddress); $url = "https://maps.googleapis.com/maps/api/geocode/json?address={$encodedAddress}&key=__MYAPIkey_"; // 搭配上述curl或带请求头的file_get_contents发起请求服务器IP或配额问题
检查Google API控制台的配额使用情况,如果请求量超出限额会被限制;另外,如果你的服务器IP被Google标记为异常,也会导致请求无响应。可以换个网络环境测试,或者在API控制台查看错误日志。
内容的提问来源于stack exchange,提问作者Su Atm
相关产品推荐
相关产品推荐

