我有一个脚本,我可以使用Google的地理编码API来获取lat / lng。但是,有时候,脚本会在收到响应之前尝试执行进一步的操作。
我的代码是:
function getvalues($myzip) {
$hello = simplexml_load_file('http://maps.googleapis.com/maps/api/geocode/xml?address='.$myzip.'&sensor=true');
return $hello;
}
在谷歌回复相关数据之前,我如何暂停并暂停执行下一个功能?我试着做一个循环 - 但这很笨拙并引起其他问题。
编辑添加:
我的下一部分代码是:
$mything = getvalues($myzip);
$lat = ($mything->result[0]->geometry[0]->location[0]->lat);
$lng = ($mything->result[0]->geometry[0]->location[0]->lng);
当显示错误时 - 我看到 -
注意:尝试在第14行的/calc_dist3.php中获取非对象的属性
注意:尝试在第14行的/calc_dist3.php中获取非对象的属性
注意:尝试在第14行的/calc_dist3.php中获取非对象的属性
注意:尝试在第15行的/calc_dist3.php中获取非对象的属性
注意:尝试在第15行的/calc_dist3.php中获取非对象的属性
注意:尝试在第15行的/calc_dist3.php中获取非对象的属性
(分别在第14/15行定义$ lat和$ lng)
答案 0 :(得分:0)
PHP主要是sequential编程语言。意味着在继续下一行之前必须完全执行每一行。帮助您看到这种情况的一种方法是将包含函数结果的变量放入if语句中,如下所示:
if($mything = getvalues($myzip))
{
$lat = ($mything->result[0]->geometry[0]->location[0]->lat);
$lng = ($mything->result[0]->geometry[0]->location[0]->lng);
}
这确保$ lat和$ lng变量只有在从函数返回值时才会运行。
其次,可能只是Google API没有邮政编码的lat或lng。将变量初始化包含在isset if语句中,并进行调试,以便在出错时显示API结果。
if($mything = getvalues($myzip))
{
if(isset($mything->result[0]->geometry[0]->location[0]->lat))
{
$lat = ($mything->result[0]->geometry[0]->location[0]->lat);
}
else
{
// display error
echo "<pre>",print_r($mything),"</pre>";
}
if(isset($mything->result[0]->geometry[0]->location[0]->lng))
{
$lng = ($mything->result[0]->geometry[0]->location[0]->lng);
}
else
{
// display error
echo "<pre>",print_r($mything),"</pre>";
}
}
else
{
echo "<pre>",print_r("Google API failed"),"</pre>";
}
答案 1 :(得分:0)
执行无法继续,直到simplexml_load_file返回(失败时返回false)。也许这是谷歌服务器的超时问题...或者也许simplexml_load_file有一个内部超时......无论哪种方式,您应该能够再次检查,直到您能够检索数据或达到任意超时时间。
function getValues(int $zip, int $timeout_secs = 2){
$hello = null;
$timeout = time() + $timeout_secs;
while(time() < $timeout && empty($hello)){
$hello = simplexml_load_file('http://maps.googleapis.com/maps/api/geocode/xml?address='.$zip.'&sensor=true');
}
return($hello);
}
if($arr = getValues(95014)){
print_r($arr);
echo '<br>';
}else{
echo 'Failed to open XML file<br>';
}
第二个参数需要以秒为单位的超时间隔。这表示在PHP放弃之前允许检索数据的时间量并返回false,表示存在错误。
此外:您可以从超时期限更改为任意次数的尝试......可能会更好。