2010-03-24 12 views
5

Ciao a tutti, ho il seguente frammento di codice phpCome arrivare fopen timeout correttamente

if($fp = fopen($url, 'r')) { 
    stream_set_timeout($fp, 1); 
    stream_set_blocking($fp, 0); 

} 
$info = stream_get_meta_data($fp); 

mi piacerebbe la richiesta di timeout dopo 1 secondo ... se metto un sonno (20) nel mio $ url che sto leggendo aspetta solo 20 secondi interi e non scade mai. C'è un modo migliore per fare un timeout con fopen?

Se uso ini_set ('default_socket_timeout', 2); al di sopra di quel codice esso va in time out correttamente ma $ info diventa nulla quindi idealmente mi piacerebbe usare le funzioni di streaming.

grazie

+0

Cosa ti aspetti da $ informazioni quando c'è un timeout della connessione? – VolkerK

risposta

10

È possibile utilizzare stream_context_create() e il http context option timeout
Ma fopen() sarà ancora restituire false se si verifica un timeout e stream_get_meta_data() non funziona.

$url = 'http://...'; 
$context = stream_context_create(array(
    'http'=>array(
    'timeout' => 2.0 
) 
)); 
$fp = fopen($url, 'r', false, $context); 
if (!$fp) { 
    echo '!fopen'; 
} 
else { 
    $info = stream_get_meta_data($fp); 
    var_dump($info); 
} 
+0

l'unico problema è che il contesto non è stato aggiunto fino a php5 e il codice che sto scrivendo sfortunatamente deve essere compatibile con php4 :( – James

+1

Il manuale dice PHP 4.3.0 quindi dovresti andare, http: //www.php.net/manual/en/function.stream-context-create.php –

+1

ho appena provato "timeout", ma quando ho scelto timeout = 2, in realtà occorrono 4 secondi per timeout, se timeout = 15 in realtà occorrono 30 secondi per il timeout. perché? – TomSawyer