2010-03-24 6 views
5

hey, je l'extrait de code suivant du code phpComment obtenir fopen Timeout correctement

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

} 
$info = stream_get_meta_data($fp); 

Je voudrais la demande de délai d'attente après 1 seconde ... si je mets un sommeil (20) Dans mon $ url que je lis il attend juste les 20 secondes entières et ne expire jamais. Y a-t-il une meilleure façon de faire des timeouts avec fopen?

Si j'utilise ini_set ('default_socket_timeout', 2); Au-dessus de ce code, il expire correctement, mais $ info devient alors nulle, idéalement, je voudrais utiliser les fonctions de flux.

grâce

+0

À quoi pensez-vous que $ info soit en cas de délai de connexion? – VolkerK

Répondre

10

Vous pouvez utiliser stream_context_create() et la http context option timeout
Mais fopen() retourne toujours false si un délai d'attente se produit et stream_get_meta_data() ne fonctionnera pas.

$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

le seul problème avec cela est que le contexte n'a pas été ajouté jusqu'à ce que php5 et le code que j'écris doit malheureusement être compatible php4 :( – James

+1

Le manuel dit PHP 4.3.0 donc vous devriez être bon à faire, http: //www.php.net/manual/fr/function.stream-context-create.php –

+1

J'ai juste essayé "timeout", mais quand j'ai choisi timeout = 2, prends en fait 4 secondes pour timeout, si timeout = 15 , prend en fait 30 secondes à l'expiration, pourquoi? – TomSawyer