2010-09-11 13 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"; 

Aldığım yanıt genellikle 21.232 saniyedir, yaklaşık beş saniye olmamalıdır ???PHP file_get_contents zaman aşımını dikkate almıyor mu?

Ini_set satırının kaldırılması hiç yardımcı olmuyor.

+0

kullanarak ondan okurken bu okuma zaman aşımı tespit üzerine, ancak, daha fazla kontrol elde yapar Herhangi bir belirgin hata ortaya çıkarsa? –

+0

@ Mahdi.M: 'ingnore_errors' özelliğini kapatamıyorum çünkü bir 404 hatası ile bağlantı sorunları tarafından üretilen bir hata arasında ayrım yapmam gerekiyor. Tekrar ifade edeyim. Ingnore_errors 'kapalıysa ve sunucu 404 $' lık bir içerik döndürürse false olur ve false olursa $ 40 içeriğinin bir 404 hatası mı yoksa bir bağlantı hatası mı olduğunu bilmem gerekir. Hata, @ işlecini bastığımda "file_get_contents (filename)" gibi bir genel olduğunu gösterdi: stream ' – Cesar

+2

açamadı Başarısız bir kural olarak, hiç kullanmanız gerekmemelidir. Uygulamanız için kritik öneme sahipse, büyük olasılıkla yanlış bir şekilde yazıyorsunuz demektir. Her zaman değil ama sık sık lanet olsun! –

cevap

13

socket_create_context ile zaman aşımını ayarlıyorsunuz. Eğer erişmeye çalıştığınız sayfa mevcut değilse, sunucu size bağlanmanızı ve size bir 404 vermenizi sağlayacaktır. Ancak, sitesi mevcut değilse (çözümlenmez veya arkasında hiçbir web sunucusu olmaz) daha sonra file_get_contents() okuma zaman aşımını yok sayar, çünkü henüz bağlanma zaman aşımına uğramamıştır.

Bağlantı zaman aşımını file_get_contents olarak ayarlayabileceğinizi düşünmüyorum. Geçenlerde o sağlar çünkü tam olarak

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

connect timeout Tabii biraz kodunuzu compicating, bir döngü içinde size ondan sonra fread() gerektirecektir fsockopen olacak belirtmek fsockopen() kullanmak için bazı kod yeniden yazdı. Eğer "ignore_errors" bayrağı ve sessiz @file_get_contents() çağrısını hem kapatarak ve bakın deneyebilir misiniz stream_get_meta_data()

http://php.net/stream_get_meta_data