2017-11-28 15 views
0

Ich habe ein Skript, bei dem ich mich an die Geocoding API von Google anpinge, um ein lat/lng zu erhalten. Gelegentlich versucht das Skript jedoch, weitere Aktionen auszuführen, bevor die Antwort empfangen wurde.simplexml_load_file warte auf Antwort

Der Code, den ich habe, ist:

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

Wie würde ich mich darüber Pause zu haben und nicht die nächsten Funktionen auszuführen, bis Google mit den relevanten Daten geantwortet hat? Ich habe versucht, eine While-Schleife zu machen - aber das war ungeschickt und verursachte andere Probleme.

bearbeiten hinzuzufügen:

Mein nächstes Stück Code ist:

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

und wenn Fehler zeigen - ich sehe -

Hinweis: Der Versuch, in Eigentum von Nicht-Objekt zu erhalten/calc_dist3.php on line 14

Hinweis: Der Versuch, die Eigenschaft non-object in /calc_dist3.php in Zeile 14

zu erhalten

Hinweis: Der Versuch, Eigentum von Nicht-Objekt in /calc_dist3.php auf der Leitung 14 zu bekommen

Hinweis: Der Versuch 15 Eigenschaft von Nicht-Objekt in /calc_dist3.php on line

Hinweis zu erhalten: Der Versuch, erhält Eigenschaft von nicht-Objekt in /calc_dist3.php on line 15

Hinweis: der Versuch, Eigentum von nicht-Objekt in /calc_dist3.php auf Linie auf so definiert 15

(mit $ lat und $ zu bekommen lng Linien 14/15)

+0

Also, wenn Sie 'getvalues ​​()' ... Zeilen nach es in Ihrem PHP ausführen, bevor die Funktion alles zurückgibt ??? Bist du sicher, dass "simplexml_load_file" nicht freigeschaltet wurde? Führen Sie eine Fehlerüberprüfung und -ausgabe durch, um sicherzugehen. – IncredibleHat

+1

Ausführung KANN NICHT und wird nicht hier fortgesetzt, bis simplexml_load_file zurückkehrt ... so ist es entweder ein Timeout- oder Verbindungsproblem. –

+0

Yep - Verbindungsproblem am Server. Vielen Dank! – user7355700

Antwort

0

PHP ist hauptsächlich eine sequential Programmiersprache. Dies bedeutet, dass jede Zeile vollständig ausgeführt werden muss, bevor mit der nächsten Zeile fortgefahren wird. Ein Weg, um Ihnen helfen, dies zu sehen ist, wenn Sie die Variable setzen Halten Sie die Funktion Ergebnis in ein if-Anweisung wie folgt:

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

Dies stellt sicher, dass das $ lat und $ lng Variablen wird nur dann ausgeführt, wenn ein Wert der Rückkehr aus die Funktion.

Zweitens, es kann nur ein Fall sein, dass die Google API kein Lat oder Lng für die Postleitzahl hat. Umschließen Sie die Variableninitialisierung innerhalb von isset if-Anweisungen und zum Debuggen das API-Ergebnis bei Fehlern.

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

Ausführung KANN NICHT fortgesetzt werden, bis die simplexml_load_file zurückgibt (bei einem Fehler wird false zurückgegeben). Vielleicht war es ein Timeout-Problem mit Google Server ... oder vielleicht Simplexml_load_file hat eine interne Zeitüberschreitung ... so oder so, sollten Sie in der Lage sein, erneut zu überprüfen, bis Sie in der Lage sind, die Daten oder eine willkürliche Timeout-Zeit zu erreichen.

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>'; 
} 

Der zweite Parameter erwartet ein Timeout-Intervall in Sekunden. Dies ist die Zeitspanne, die zum Abrufen der Daten benötigt wird, bevor PHP aufgibt, und gibt false zurück, was darauf hinweist, dass ein Fehler aufgetreten ist.

Weiter: Sie können von einer Zeitüberschreitung zu einer willkürlichen Anzahl von Versuchen wechseln ... könnte besser funktionieren.