simplexml_load_file等待响应

时间:2017-11-28 20:52:01

标签: php

我有一个脚本,我可以使用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)

2 个答案:

答案 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,表示存在错误。

此外:您可以从超时期限更改为任意次数的尝试......可能会更好。