PHP调用Google API转地址经纬度时遇Over_Query_Limit错误求助
解决Google API Over_Query_Limit错误的实用方案
你遇到的OVER_QUERY_LIMIT是Google Maps API最常见的限制类问题,结合你的代码情况,我整理了几个关键修复和优化步骤,帮你彻底解决这个问题:
1. 必须添加有效的Google API密钥
现在Google Maps旗下的所有API(包括Geocoding和Distance Matrix)都强制要求使用API密钥,无密钥的请求配额极低(几乎无法满足正常使用需求),这是触发限制的核心原因之一。
操作步骤:
- 登录Google Cloud Console,找到并启用Geocoding API和Distance Matrix API
- 创建一个API密钥(建议设置IP或应用限制,防止密钥被盗用)
- 在所有API请求的URL末尾添加
&key=你的API密钥参数
2. 优化请求频率与重试机制
你代码里的sleep(2)只能应付单次请求的简单延迟,但面对配额限制远远不够,尤其是批量处理场景。建议实现指数退避重试策略:
关键优化点:
- 当API返回
OVER_QUERY_LIMIT状态时,不要直接放弃,而是先等待一段时间再重试,每次等待时间翻倍(比如第一次等2秒,第二次4秒,第三次8秒,最多重试3-5次) - 提前确认Google给的配额:免费层Geocoding API每天2500次请求,Distance Matrix API每天1000次,启用计费后配额会大幅提升
3. 修复代码中的潜在问题
你的代码还有几个小细节问题,可能间接导致请求效率低或异常:
file_get_contents请求Geocoding API稳定性不足,建议统一换成curl(和Distance Matrix的请求方式保持一致)- 距离计算函数的参数顺序容易混淆,调整得更直观
- 增加错误分支处理,避免因API返回异常导致脚本崩溃
修改后的完整代码示例:
<?php // 替换成你的Google API密钥 $apiKey = "YOUR_GOOGLE_API_KEY"; $address = 'iqra university islamabad'; // 使用curl请求Geocoding API,替代file_get_contents提升稳定性 $geocodeUrl = "https://maps.google.com/maps/api/geocode/json?address=" . urlencode($address) . "&sensor=false&key=" . $apiKey; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $geocodeUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $geocodeResponse = curl_exec($ch); curl_close($ch); $response = json_decode($geocodeResponse); if ($response->status == 'OK') { $latitude = $response->results[0]->geometry->location->lat; $longitude = $response->results[0]->geometry->location->lng; // 调整参数顺序为:起点经纬度、终点经纬度,更直观 GetDrivingDistance(33.651936, 73.064366, $latitude, $longitude, $apiKey); echo '<br />'; echo 'Latitude: ' . $latitude; echo '<br />'; echo 'Longitude: ' . $longitude; } else { // 明确输出错误状态,方便调试 echo 'Geocoding API Error: ' . $response->status; } function GetDrivingDistance($originLat, $originLng, $destLat, $destLng, $apiKey) { $distanceUrl = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" . $originLat . "," . $originLng . "&destinations=" . $destLat . "," . $destLng . "&mode=driving&language=pl-PL&key=" . $apiKey; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $distanceUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); $response = curl_exec($ch); curl_close($ch); $response_a = json_decode($response, true); // 增加距离API的错误检查 if (isset($response_a['status']) && $response_a['status'] == 'OK') { $dist = $response_a['rows'][0]['elements'][0]['distance']['text']; $time = $response_a['rows'][0]['elements'][0]['duration']['text']; echo 'distance: ' . $dist; // return array($dist,$time); } else { echo 'Distance Matrix API Error: ' . $response_a['status']; } } ?>
4. 额外注意事项
- 登录Google Cloud Console的API配额页面,实时监控请求使用情况,提前预判配额耗尽风险
- 如果是批量处理大量地址,使用批量Geocoding请求(一次最多处理50个地址),减少请求次数
- 对频繁查询的地址,缓存经纬度结果(比如存入数据库),避免重复调用Geocoding API浪费配额
内容的提问来源于stack exchange,提问作者user9706969
相关产品推荐
相关产品推荐

