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