PHP Wenn externe Datei nicht erreichbar sofort abbrechen!

Belee

Lt. Commander
Registriert
Dez. 2006
Beiträge
1.518
Hallo

Folgendes macht das Script......

Prüfen ob eine externe Datei "xml" vorhanden, falls ja,
wird sie lokal gespeichert.

Das Problem jetzt, wenn der Server mal nicht erreichbar ist bzw. Datei
dann dauert es und dauert es bis das Script abbricht.
Ich habe doch einen TimeOut angegeben, warum dauert das ganze
bei nicht Erreichbarkeit trotzdem sehr lange? was habe ich falsch gemacht?


PHP:
 function urlfind($link) {
  $ckd  = ini_set('default_socket_timeout', 5);
  $ret = (bool) @fopen ($link, 'r');
  ini_set('default_socket_timeout', $ckd);
  return $ret;
}   
 $link = "http://www.xxxxx.de/abc.xml";    
 
 if(urlfind($link)) {
 
 $content = file_get_contents($link);
 $fp = fopen('dir/abc.xml', 'w'); 
 fwrite($fp, $content); 
 fclose($fp); 
}
 
Bei file_get_contents lässt sich eine Context Ressource angeben, damit sollte das funktionieren!

PHP:
$context = stream_context_create(array(
    'http' => array(
        'timeout' => 5      // Timeout in seconds
        )
    )
);

$file = file_get_contents('link/zur/xml/datei', 0, $context);

if(false !== $file) {
    //Copy file...
}

/edit:
Bei dieser Lösung musst du auch vorher nicht mehr überprüfen, ob die Datei erreichbar ist, dh. du brauchst nur einmal eine Verbindung zum anderen Server aufbauen.

/edit2:
Anscheinend ruft die Funktion file_get_contents die Datei intern 2 mal auf, was dazu führt, dass bei Nichterreichbarkeit der Datei die tatsächliche Wartezeit doppelt so groß wie die in $context angegebene ist. Allerdings hilft es wenig, den Timeout einfach zu halbieren, da folgende php Datei nur mit einem Timeout von 11 Sekunden vom obigen Skript geladen werden kann:
PHP:
sleep(10);

echo 'Fertig!';

/edit3:
Eine Alternative wäre natürlich cURL.
 
Zuletzt bearbeitet:
Zurück
Oben