190 votes

La fonction file_get_contents() a-t-elle un paramètre de délai d'attente ?

J'appelle une série de liens en utilisant la fonction file_get_contents() dans une boucle. Chaque lien peut prendre plus de 15 minutes à traiter. Maintenant, je me demande si la méthode PHP file_get_contents() a un délai d'attente ?

Si c'est le cas, il se termine par un appel et passe au lien suivant. Je ne veux pas appeler le lien suivant sans que le lien précédent ne soit terminé.

Alors, s'il vous plaît, dites-moi si file_get_contents() a un délai d'attente. Le fichier qui contient le file_get_contents() est réglé sur set_time_limit() à zéro (illimité).

0 votes

0 votes

J'ai rencontré le même comportement (délai d'attente lors de l'interrogation d'une URL sur le même "serveur") dans un projet PHP Visual Studio qui utilise les extensions PHP Tools for Visual Studio. Plus d'informations ici .

1 votes

Cela se produit également lorsque l'on utilise le serveur PHP intégré pour interroger une URL sur le même site web parce qu'il s'agit d'un serveur web à file d'attente unique.

353voto

stewe Points 14623

Le délai d'attente par défaut est défini par default_socket_timeout ini-setting qui est de 60 secondes. Vous pouvez également le modifier à 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 la méthode suivante stream_context_create pour définir le délai d'attente comme Options du contexte HTTP de la Enveloppeur de flux HTTP en cours d'utilisation :

$ctx = stream_context_create(array('http'=>
    array(
        'timeout' => 1200,  //1200 Seconds is 20 Minutes
    )
));

echo file_get_contents('http://example.com/', false, $ctx);

10 votes

Pouvez-vous donner des informations sur la façon de définir le délai d'attente pour les url https ?

11 votes

ce truc ne fonctionne pas parfaitement, si votre valeur est 1200, elle est en fait 2400. je viens de le tester.

21 votes

default_socket_timeout, stream_set_timeout, et stream_context_create timeout sont tous les timeout de chaque ligne lue/écrite, pas le timeout de la connexion entière.

42voto

Randell Points 2679

Comme le mentionne @diyism, " default_socket_timeout, stream_set_timeout, et stream_context_create timeout sont tous les timeout de chaque ligne lue/écrite, pas le timeout de la connexion entière. " Et la première réponse de @stewe m'a fait défaut.

Comme alternative à l'utilisation de file_get_contents vous pouvez toujours utiliser curl avec un temps mort.

Voici donc un code qui fonctionne pour appeler les liens.

$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;

2 votes

Cette réponse donne une autre approche pour contrôler le délai de connexion (en utilisant la fonction fsockopen au lieu de curl ) : stackoverflow.com/a/3690321/1869825

2 votes

Vous devez définir à la fois CURLOPT_CONNECTTIMEOUT et CURLOPT_TIMEOUT dans curl. Voir stackoverflow.com/a/27776164/1863432

2 votes

Ce n'est pas une réponse valide, la question porte sur "file_get_contents". La réponse est géniale mais inapropriée.

35voto

Cryptopat Points 119

Oui ! En passant un contexte du flux dans le troisième paramètre :

Ici, avec un délai d'attente de 1s :

file_get_contents("https://abcedef.com", 0, stream_context_create(["http"=>["timeout"=>1]]));

Source dans la section des commentaires de https://www.php.net/manual/en/function.file-get-contents.php

Options du contexte HTTP :

method
header
user_agent
content
request_fulluri
follow_location
max_redirects
protocol_version
timeout

Autres contextes : https://www.php.net/manual/en/context.php

2 votes

La réponse avec 286 rep n'a pas fonctionné, mais la vôtre oui :)

6 votes

Le délai d'attente indiqué dans stream_context_create ne fonctionne que pour le délai de connexion. Si le serveur répond (envoie quelques données) dans le délai imparti, mais prend une éternité pour envoyer le reste de sa charge utile, ce délai n'interrompt pas le transfert lent.

6voto

Pascal Roget Points 703

Il convient de noter que si l'on modifie default_socket_timeout à la volée, il pourrait être utile de restaurer sa valeur après votre fichier_get_contenu appeler :

$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);

1 votes

Mais vous savez que ini_set ne fixe pas les choses de façon permanente, n'est-ce pas ? donc en gros, la moitié de votre script est juste inutile

3 votes

@FlashThunder Pas s'il y a un autre appel à file_get_contents plus tard dans le code qui nécessite le timeout précédent. La restauration des paramètres modifiés à la volée pour un bout de code spécifique après l'exécution de ce code est généralement une bonne pratique.

2 votes

@FlashThunder c'est une bonne pratique de restaurer la valeur de socket_timeout après un appel de sorte que les appels ultérieurs à la même fonction dans la même exécution du script. utiliser les paramètres globaux.

1voto

Max Points 416

Pour moi, cela fonctionne quand je change mon php.ini dans mon hôte :

; Default timeout for socket based streams (seconds)
default_socket_timeout = 300

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X