J'exécute une requête curl sur une base de données eXist via php. L'ensemble de données est très volumineux et, par conséquent, la base de données prend constamment beaucoup de temps pour renvoyer une réponse XML. Pour résoudre ce problème, nous avons mis en place une demande curl, avec ce qui est censé être un long délai.
$ch = curl_init();
$headers["Content-Length"] = strlen($postString);
$headers["User-Agent"] = "Curl/1.0";
curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'admin:');
curl_setopt($ch,CURLOPT_TIMEOUT,1000);
$response = curl_exec($ch);
curl_close($ch);
Cependant, la demande curl se termine systématiquement avant la fin de la demande (<1000 lorsqu'elle est demandée via un navigateur). Quelqu'un sait-il si c'est la bonne façon de définir des délais d'attente en boucle?
set_time_limit(0);
si le script s'exécute sur la console.php -d max_execution_time=1 -r 'while(true){$r=1*1;}'
ou d'observer en action que le cli n'a pas de drapeau magique "toujours illimité".set_time_limit(0)
si vous ne l'utilisez pas dans une boucle.Hmm, il me semble que
CURLOPT_TIMEOUT
définit le temps que toute fonction cURL est autorisée à exécuter. Je pense que vous devriez plutôt regarder à laCURLOPT_CONNECTTIMEOUT
place, car cela indique à cURL le temps maximal d'attente pour la connexion.la source
CURLOPT_TIMEOUT
sur le temps que prend la fonction, les documents de la bibliothèque curl sous - jacente semblent dire que c'est sur le temps que prend la demande, ce qui est une distinction intéressante - je ne sais pas dans quel sens lire cela!Il y a une bizarrerie avec cela qui pourrait être pertinente pour certaines personnes ... D'après les commentaires des documents PHP.
Depuis http://www.php.net/manual/en/function.curl-setopt.php#104597
la source
Votre code définit le délai d'expiration à 1000 secondes . Pour les millisecondes, utilisez
CURLOPT_TIMEOUT_MS
.la source
Vous devrez vous assurer des délais d'attente entre vous et le fichier. Dans ce cas, PHP et Curl.
Pour indiquer à Curl de ne jamais expirer lorsqu'un transfert est toujours actif, vous devez définir
CURLOPT_TIMEOUT
sur0
, au lieu de1000
.En PHP, encore une fois, vous devez supprimer les limites de temps ou PHP lui-même (après 30 secondes par défaut) tuera le script le long de la demande de Curl. Cela seul devrait résoudre votre problème .
De plus, si vous avez besoin de l'intégrité des données, vous pouvez ajouter une couche de sécurité en utilisant
ignore_user_abort
:Une déconnexion du client va interrompre l'exécution du script et éventuellement endommager les données,
par exemple. requête de base de données non transitionnelle, création d'un fichier de configuration, etc., alors que dans votre cas, il téléchargerait un fichier partiel ... et vous pourriez, ou non, vous en soucier.
Répondre à cette ancienne question, car ce fil est en haut des recherches de moteurs
CURL_TIMEOUT
.la source
Vous ne pouvez pas exécuter la demande à partir d'un navigateur, il attendra que le serveur exécutant la demande CURL réponde. Le navigateur expire probablement dans 1-2 minutes, le délai d'attente par défaut du réseau.
Vous devez l'exécuter à partir de la ligne de commande / du terminal.
la source
Si vous utilisez PHP comme application fastCGI, assurez-vous de vérifier les paramètres de délai d'attente fastCGI. Voir: PHP curl put 500 error
la source