2010-09-11 12 views
13
$url = 'http://a.url/i-know-is-down'; 

//ini_set('default_socket_timeout', 5); 

$ctx = stream_context_create(array(
    'http' => array(
     'timeout' => 5, 
     'ignore_errors' => true 
     ) 
    ) 
); 

$start = microtime(true); 
$content = @file_get_contents($url, false, $ctx); 
$end = microtime(true); 
echo $end - $start, "\n"; 

die Antwort, die ich bekomme, ist in der Regel 21.232 segs, sollte nicht etwa fünf Sekunden sein ???PHP file_get_contents ignorieren Timeout?

Die uncommentation der ini_set-Zeile hilft überhaupt nicht.

+0

verwenden, könnten Sie versuchen, das Ausschalten sowohl die „IGNORE_ERRORS“ Flagge sowie die stillen @file_get_contents() -Aufruf und sehen wenn irgendwelche offensichtlichen Fehler herauskommen? –

+0

@ Mahdi.M: Ich kann 'ingnore_errors' nicht ausschalten, weil ich zwischen einem 404-Fehler und einem Fehler unterscheiden muss, der durch Verbindungsprobleme erzeugt wird. Lass es mich anders formulieren. Wenn ingnore_errors ausgeschaltet ist und der Server einen 404 $ Inhalt zurückgibt, wäre false und ich muss wissen ob $ content wenn false ist, weil ein 404 Fehler oder ein Verbindungsfehler ist. Der Fehler, der beim Unterdrücken des @ -Operators auftrat, ist ein generischer Fehler wie 'file_get_contents (Dateiname): Fehler beim Öffnen des Streams. ' – Cesar

+2

Als Faustregel sollten Sie niemals @ verwenden. Wenn es für Ihre Anwendung wichtig ist, schreiben Sie es wahrscheinlich falsch. Nicht immer, aber verdammt oft! –

Antwort

13

Sie setzen das lesen Timeout mit socket_create_context. Wenn die Seite, auf die Sie zugreifen möchten, nicht existiert, dann wird der Server Sie verbinden lassen und Ihnen eine 404 geben. Wenn jedoch die Website nicht existiert (wird nicht aufgelöst oder kein Webserver dahinter) , dann ignoriert file_get_contents() das Lese-Timeout, weil es noch nicht einmal eine Zeitüberschreitung bei der Verbindungsherstellung gibt.

Ich glaube nicht, dass Sie das Verbindungstimeout in file_get_contents einstellen können. Ich schrieb vor kurzem einen Code fsockopen() genau zu verwenden, weil es Ihnen connect timeout

$connTimeout = 30 ; 
$fp = fsockopen($hostname, $port, $errno, $errstr, $connTimeout); 

Ofcourse gehen fsockopen Sie benötigen, um dann fread() von ihm in einer Schleife angeben können, Ihren Code leicht compicating. Es macht Ihnen mehr Kontrolle geben, aber auf Lese Timeouts Erkennung während aus der Lektüre stream_get_meta_data()

http://php.net/stream_get_meta_data

Verwandte Themen