Php Google地理编码API错误:超过查询限制

Php Google地理编码API错误:超过查询限制,php,google-geocoder,google-geocoding-api,Php,Google Geocoder,Google Geocoding Api,我目前正在使用谷歌地理编码API,并且非常节省地使用它。每天的查询限制是2500次,我最多可能在20-50次之间。然后,在过去的一周里,我经常会收到一个超过查询限制的错误。我一次只处理一个地址,没有循环或任何东西。它只进行一次地理编码,并将lat/lng发送至数据库,之后仅作为数据库的参考。有人能告诉我为什么我会犯这个错误吗 $request_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=".$siteAddress

我目前正在使用谷歌地理编码API,并且非常节省地使用它。每天的查询限制是2500次,我最多可能在20-50次之间。然后,在过去的一周里,我经常会收到一个超过查询限制的错误。我一次只处理一个地址,没有循环或任何东西。它只进行一次地理编码,并将lat/lng发送至数据库,之后仅作为数据库的参考。有人能告诉我为什么我会犯这个错误吗

$request_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=".$siteAddress."&sensor=true";
在大约一周前的一个多月的测试中,这项技术一直运行良好

我有一些网页做同样的事情,但只是在不同的时间,为不同的目的引用。以下是地理编码的所有代码

  $request_url = "http://maps.googleapis.com/maps/api/geocode/xml?address=".$siteAddress."&sensor=true"; // the request URL you'll send to google to get back your XML feed
$xml = simplexml_load_file($request_url) or die("url not loading");// XML request
$status = $xml->status;// GET the request status as google's api can return several responses
if ($status=="OK") {
    //request returned completed time to get lat / lang for storage
    $lat = $xml->result->geometry->location->lat;
    $long = $xml->result->geometry->location->lng;
echo "latitude:$lat, longitude:$long <br>";
    echo "$lat, $long <br>";  //spit out results or you can store them in a DB if you wish
}
if ($status=="ZERO_RESULTS") {
    //indicates that the geocode was successful but returned no results. This may occur if the geocode was passed a non-existent address or a latlng in a remote location.
$errorcode = "ZERO RESULTS";
echo "ZERO RESULTS";
}
if ($status=="OVER_QUERY_LIMIT") {
    //indicates that you are over your quota of geocode requests against the google api
$errorcode = "Over Query Limit";
echo "Over Query Limit";
}
if ($status=="REQUEST_DENIED") {
    //indicates that your request was denied, generally because of lack of a sensor parameter.
$errorcode = "Request Denied";
echo "Request Denied";
}
if ($status=="INVALID_REQUEST") {
    //generally indicates that the query (address or latlng) is missing.
$errorcode = "Invalid Request";
echo "Invalid Request";
}
$request\u url=”http://maps.googleapis.com/maps/api/geocode/xml?address=“$siteAddress。”&sensor=true”;//您将发送到google以获取XML提要的请求URL
$xml=simplexml_load_file($request_url)或die(“url未加载”);//XML请求
$status=$xml->status;//获取请求状态,因为google的api可以返回多个响应
如果($status==“OK”){
//请求返回获取存储lat/lang的完成时间
$lat=$xml->result->geometry->location->lat;
$long=$xml->result->geometry->location->lng;
echo“纬度:$lat,经度:$long
”; echo“$lat,$long
”;//吐出结果,或者如果愿意,可以将结果存储在数据库中 } 如果($status==“零结果”){ //表示地理代码已成功,但未返回任何结果。如果向地理代码传递了不存在的地址或远程位置的latlng,则可能会发生这种情况。 $errorcode=“零结果”; 回应“零结果”; } 如果($status==“超过查询限制”){ //表示您超过了针对google api的地理编码请求配额 $errorcode=“超出查询限制”; 回显“超过查询限制”; } 如果($status==“请求被拒绝”){ //表示您的请求被拒绝,通常是因为缺少传感器参数。 $errorcode=“请求被拒绝”; 回显“请求被拒绝”; } 如果($status==“无效的请求”){ //通常表示缺少查询(地址或latlng)。 $errorcode=“无效请求”; 回显“无效请求”; }
谷歌地理编码API有每日限制,但它也限制了您发出请求的速度。在geocode调用之间进行一次
sleep(1)
调用,您可能会没事(如果没有,请尝试再增加几秒钟)。

$output=json\u decode(stripslashes(file\u get\u contents()http://maps.googleapis.com/maps/api/geocode/json?latlng=“.$data['lat'].”、“.$data['lon'].”和sensor=false&language=ru'); 打印$output->结果[0]->格式化的\u地址
睡眠(2) 地理编码的每日限制为2500,但也受到限制。所以,正如其他人所建议的,大约每10条记录在PHP代码中编写一次sleep(1)语句。您可能还想编写一个队列模块/进程来控制请求。将结果缓存到地址缓存模块或其他缓存类型中

此外,您是否考虑过IP地址上的其他域/用户?SugarCRM的SugarOnDemand有这个问题。太多共享同一IP地址的用户,试图在同一时间对地址进行地理编码,可能会导致可怕的超限问题

耐心点。如果上述方法不起作用。安装一台装有WAMP服务器的笔记本电脑,然后前往当地支持WIFI的咖啡店。它们通常具有不同的IP地址,因此您可以每天对其进行地理编码2500*5。这很痛苦,但很有效


如果你真的想有创意,可以编写一个代理脚本(PHP)从不同的IP地址(其他域)跳出CURL请求。Google的地理编码API会认为请求来自代理脚本的IP地址。

某些非典型或格式错误的地址字符串仍会抛出此错误

在本次发布时,某些以散列字符开头的地址字符串会导致超查询限制状态响应

如果您知道自己受到API调用限制和使用限制,特别是如果您在Google有一个付费帐户,我会查找不寻常的字符,尤其是地址字符串的开头


在大多数情况下,公寓/单元号码会变成地址数据,删除有问题的子字符串不会对位置产生太大影响。

我尝试将sleep(1)放在地理编码调用之前(因为只有一个),但它仍然通过查询限制返回。您可能会被阻止一两个小时,然后再次,如果一开始不起作用,请尝试大于1的值。不幸的是,这不起作用。谷歌是否对地理编码设置了其他限制?这与现有的答案类似,只是它没有提供任何解释,而是获取
格式化的地址字段。您应该编辑您的答案,并使其更加明显。我们可以使用VPN来隐藏我们的IP吗?您可以使用VPN或其他代理方法来更改请求的IP地址。
$output= json_decode(stripslashes(file_get_contents('http://maps.googleapis.com/maps/api/geocode/json?latlng='.$data['lat'].','.$data['lon'].'&sensor=false&language=ru')));
print $output->results[0]->formatted_address
sleep(2);