J'appelle une série de liens en utilisant la méthode file_get_contents()
dans une boucle. Chaque lien peut prendre plus de 15 minutes à traiter. Maintenant, je me demande si la file_get_contents()
de PHP a un délai d'attente?
Si oui, il expirera avec un appel et passera au lien suivant. Je ne veux pas appeler le prochain lien sans terminer le précédent.
Alors, dites-moi s'il vous plaît si file_get_contents()
a un délai d'expiration. Le fichier contenant la file_get_contents()
est défini sur set_time_limit()
à zéro (illimité).
Le délai d'attente par défaut est défini par _default_socket_timeout
_ ini-setting , qui correspond à 60 secondes. Vous pouvez également le changer à la volée:
_ini_set('default_socket_timeout', 900); // 900 Seconds = 15 Minutes
_
Une autre façon de définir un délai d'attente serait d'utiliser stream_context_create
pour définir le délai d'attente comme options de contexte HTTP de wrapper de flux HTTP utilisé:
_$ctx = stream_context_create(array('http'=>
array(
'timeout' => 1200, //1200 Seconds is 20 Minutes
)
));
echo file_get_contents('http://example.com/', false, $ctx);
_
Comme @diyism l'a mentionné, "default_socket_timeout, stream_set_timeout et stream_context_create timeout sont tous les délais de lecture/écriture, pas le délai de connexion complet." Et la première réponse de @stewe m'a échoué.
Au lieu d'utiliser file_get_contents
, vous pouvez toujours utiliser curl
avec un délai d'attente.
Alors, voici un code de travail qui fonctionne pour les liens d’appel.
$url='http://example.com/';
$ch=curl_init();
$timeout=5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$result=curl_exec($ch);
curl_close($ch);
echo $result;
Il est à noter que si vous changez default_socket_timeout à la volée, il peut être utile de restaurer sa valeur après votre (file_get_contents call:
$default_socket_timeout = ini_get('default_socket_timeout');
....
ini_set('default_socket_timeout', 10);
file_get_contents($url);
...
ini_set('default_socket_timeout', $default_socket_timeout);
Pour que je travaille quand je change de php.ini dans mon hôte:
; Default timeout for socket based streams (seconds)
default_socket_timeout = 300