2017-11-28 15 views
0

GoogleのジオコーディングAPIを使用して緯度/経度を取得するスクリプトがあります。ただし、スクリプトが応答を受け取る前に、さらにアクションを実行しようとすることがあります。simplexml_load_file応答待ち

私が持っているコードは次のとおりです。

function getvalues($myzip) { 
    $hello = simplexml_load_file('http://maps.googleapis.com/maps/api/geocode/xml?address='.$myzip.'&sensor=true'); 
    return $hello; 
} 

は、どのように私はそれはGoogleが関連データと答えたまで次の機能を実行し、一時停止しないで持って行くのでしょうか? whileループをやってみましたが、それは不器用で他の問題を引き起こしました。追加する

編集:

コードの私の次のビットは次のとおりです。

$mything = getvalues($myzip); 
$lat = ($mything->result[0]->geometry[0]->location[0]->lat); 
$lng = ($mything->result[0]->geometry[0]->location[0]->lng); 

やエラーを示す - 私は見る -

お知らせ:非オブジェクトのプロパティを取得しようとすると/ calc_dist3.php on line 14

注意:行14の/calc_dist3.phpにある非オブジェクトのプロパティを取得しようとしています

お知らせ:15

お知らせ行に/calc_dist3.phpで非オブジェクトのプロパティを取得しようとすると:しようとしている14

お知らせ行に/calc_dist3.phpで非オブジェクトのプロパティを取得しようとすると、 $ LATおよび$ LNGは、上に定義された状態で15

ライン上/calc_dist3.phpで非オブジェクトのプロパティを取得しようとすると(:15

お知らせ行に/calc_dist3.phpで非オブジェクトのプロパティを取得それぞれ14/15行)

+0

だから、 'getvalues()' ...という行を呼び出すと、関数は関数が何かを返す前にPHPで実行していますか?あなたは 'simplexml_load_file'がうまくいけないと確信していますか?いくつかのエラーチェックと出力を行い、確認してください。 – IncredibleHat

+1

実行はできません。また、simplexml_load_fileが戻るまで、ここでは続行できません。タイムアウトまたは接続の問題です。 –

+0

サーバでの接続に問題があります。ありがとう! – user7355700

答えて

0

PHPは主にsequentialのプログラミング言語です。つまり、次の行に進む前に、各行を完全に実行する必要があります。あなたはそうのようなif文の中に関数の結果を保持する変数を入れた場合、これは見るのを助けるための一つの方法:これは$ LATと$ LNG変数は値を1回だけ実行されることを保証

if($mything = getvalues($myzip)) 
{ 
    $lat = ($mything->result[0]->geometry[0]->location[0]->lat); 
    $lng = ($mything->result[0]->geometry[0]->location[0]->lng); 
} 

がから復帰です関数。

第2に、Google APIに郵便番号の緯度または経度がない場合があります。変数の初期化を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>"; 
} 
0

実行可能simplexml_load_fileが返されるまで続行できません(失敗した場合はfalseを返します)。おそらく、それはGoogleサーバーのタイムアウトの問題でした...または多分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>'; 
} 

第2パラメータでは、タイムアウト間隔(秒単位)が必要です。これは、PHPが断念する前にデータを取得できる時間を表し、エラーがあったことを示すfalseを返します。

さらに、タイムアウト期間から任意の試行回数に変更することができます。より効果的です。

関連する問題