web-dev-qa-db-fra.com

File_get_contents () a-t-il un délai d'attente?

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é).

138
Flora Clinton

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);
_
270
stewe

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;
29
Randell

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);
6
Pascal Roget

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
1
Max