Php 分割地理编码任务
我目前正在做一个项目,需要对存储在mySQL数据库中的位置进行地理编码 我编写了一个小脚本,将CSV导入mySQL数据库,并自动将每行的经度和纬度字段填充为“0.000000” 现在,我找到了一个脚本,它可以检查数据库中是否有丢失的地理代码,并对其进行更新。因为我才几岁,刚刚和谷歌合作,所以我把它安装到了我的需要上(应该和Wordpress和提名一起工作,而不是谷歌地图) 导入CSV工作正常,但是当运行此脚本更新大约5200个位置时,我会得到一个超时。不幸的是,我不能增加任何超时设置,所以我需要将任务分成多个步骤 我怎样才能做到这一点 说到PHP,我还是有点生疏,所以任何帮助都将不胜感激。我已经尝试过通过增加一个计数器变量来拆分循环,该变量与需要更新的mySQL行数成平方。它现在应该每100行刷新一次页面,但不幸的是它没有真正工作。它适用于大约500个位置,但在此之后-超时 有人知道解决办法吗Php 分割地理编码任务,php,mysql,split,geocode,Php,Mysql,Split,Geocode,我目前正在做一个项目,需要对存储在mySQL数据库中的位置进行地理编码 我编写了一个小脚本,将CSV导入mySQL数据库,并自动将每行的经度和纬度字段填充为“0.000000” 现在,我找到了一个脚本,它可以检查数据库中是否有丢失的地理代码,并对其进行更新。因为我才几岁,刚刚和谷歌合作,所以我把它安装到了我的需要上(应该和Wordpress和提名一起工作,而不是谷歌地图) 导入CSV工作正常,但是当运行此脚本更新大约5200个位置时,我会得到一个超时。不幸的是,我不能增加任何超时设置,所以我需要
// Opens a connection to a MySQL server
$connection = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$connection) {
die("Not connected : " . mysql_error());
}
// Set the active MySQL database
$db_selected = mysql_select_db(DB_NAME, $connection);
if (!$db_selected) {
die("Can\'t use db : " . mysql_error());
}
// Select all the rows in the markers table
$query = "SELECT * FROM locations WHERE 1";
$result = mysql_query($query);
if (!$result) {
die("Invalid query: " . mysql_error());
}
// Initialize delay in geocode speed
$delay = 0;
function getLnt($address){
$request_url = "http://nominatim.openstreetmap.org/search?q=".urlencode($address)."&format=json&addressdetails=1";
$result_string = file_get_contents($request_url);
$result_json = json_decode($result_string, true);
return $result_json[0];
}
// Iterate through the rows, geocoding each address
while ($row = @mysql_fetch_assoc($result)) {
$geocode_pending = true;
while ($geocode_pending) {
$street = $row["address"];
$zip = $row["zip"];
$city = $row["city"];
$id = $row["id"];
$address = $street.', '.$zip.' '.$city;
$details = getLnt($address);
$lat = $details[lat];
$lng = $details[lon];
$state = $details[address][state];
$country_iso = $details[address][country_code];
if (http_response_code() == 200) {
// successful geocode
$geocode_pending = false;
$query = sprintf("
UPDATE locations SET lat = '%s', lng = '%s', state = '%s', country_iso = '%s' WHERE lat = '0.000000' AND lng = '0.000000' AND id = '%s' LIMIT 1;",
mysql_real_escape_string($lat), mysql_real_escape_string($lng), mysql_real_escape_string(utf8_decode($state)),mysql_real_escape_string($country_iso),mysql_real_escape_string($id)
);
$update_result = mysql_query($query);
if (!$update_result) {
die("Invalid query: " . mysql_error());
}
} else if(http_response_code() == 620) {
// sent geocodes too fast
$delay += 100000;
} else if($details == NULL) {
// failure to geocode
$geocode_pending = false;
echo "Address " . $address . " failed to geocoded. ";
echo "Received status " . $status . "
\n";
}
usleep($delay);
}
}
您必须将分页添加到位置查询:
// Select all the rows in the markers table
$offset = intval($_GET['offset'];
$query = "SELECT * FROM locations WHERE 1 LIMIT $offset, 100";
然后在浏览器中重复浏览页面。您可以手动执行,也可以在另一个页面上使用javascript/jquery来查询目标:
var locations_count = 1000000;
var offset = 0;
var func = function(){
$.get('update-location.php', {offset: offset}, function(){
document.write('<br/>Processed ' + offset + ' records');
offset += 100;
if( offset < locations_count )
setTimeout(func, 100);
else
document.write('<br/>Update finished');
});
};
func();
var位置\u计数=1000000;
var偏移=0;
var func=函数(){
$.get('update-location.php',{offset:offset},function(){
文件。写入(“
已处理”+偏移量+“记录”);
偏移量+=100;
if(偏移量<位置\计数)
setTimeout(func,100);
其他的
编写(“
更新完成”);
});
};
func();
(不要忘记将位置\u count
更新为您的实际位置数)
和其他解决方案:
将表转储到本地计算机,然后在本地更新,然后在服务器上更新生成的表。毫秒似乎有问题<代码>$delay+=100000基本上是指每次发送“太多请求…”
620
响应时延迟1/10秒。这不会是问题,否则我会在剩余的一天被阻止。是否可以完全使用PHP并完全自动执行此操作?正如我所说的-复制到本地机器,进行更新,然后将结果上传回来-这将只是php。将其复制到本地计算机不是一个选项-它必须在服务器上工作。伙计,你看到它根本不像在浏览器中那样工作,你应该同意一些妥协。我为您提供了一个JS前端,它可以消除大量的问题,因为您有时间限制,无法在一次调用中完成。所以你必须把你的工作分成许多电话。在浏览器中,您只能使用javascript执行许多调用。