Paramétrage du délai de Curl en PHP

j'exécute une requête curl sur une base de données existante via php. L'ensemble de données est très grand, et par conséquent, la base de données prend constamment beaucoup de temps pour retourner une réponse XML. Pour corriger cela, nous avons mis en place une requête curl, avec ce qui est supposé être un long délai d'attente.

$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 requête curl se termine systématiquement avant que la requête ne soit terminée (<1000 lorsqu'elle est demandée via un navigateur). Personne ne sait si c'est la bonne façon de définir les délais en curl?

182
demandé sur JakeGould 2010-04-06 05:03:01

7 réponses

voir documentation: http://www.php.net/manual/en/function.curl-setopt.php

CURLOPT_CONNECTTIMEOUT - le nombre de secondes à attendre en essayant de se connecter. Utilisez 0 pour attendre indéfiniment.

CURLOPT_TIMEOUT - le nombre maximum de secondes pour permettre l'exécution des fonctions cURL.

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds

aussi n'oubliez pas d'élargir l'exécution de temps de php script self:

set_time_limit(0);// to infinity for example
282
répondu msangel 2017-12-21 18:34:32

Hmm, il me semble que CURLOPT_TIMEOUT définit le temps que toute fonction cURL est autorisée à prendre pour exécuter. Je pense que vous devriez en fait regarder CURLOPT_CONNECTTIMEOUT à la place, car cela indique à cURL le temps maximum pour attendre que la connexion soit terminée.

52
répondu Chad Birch 2010-04-06 01:10:31

votre code fixe le délai d'attente à 1000 secondes . Pour les millisecondes, utilisez CURLOPT_TIMEOUT_MS .

25
répondu Matt Humphreys 2012-04-23 14:49:53

il y a une bizarrerie avec cela qui pourrait être pertinente pour certaines personnes... D'après les commentaires de PHP docs.

si vous voulez que cURL soit temporisé en moins d'une seconde, vous pouvez utiliser CURLOPT_TIMEOUT_MS , bien qu'il y ait un bug/" Fonctionnalité "sur les" systèmes de type Unix "qui fait que libcurl soit temporisé immédiatement si la valeur est < 1000 ms avec l'erreur"cURL Error (28): Timeout a été atteint". L'explication de ce comportement est:

"Si libcurl est construit pour utiliser le résolveur de nom de système standard, cette partie du transfert utilisera toujours la résolution de pleine seconde pour les temps d'arrêt avec un temps d'arrêt minimum autorisé d'une seconde."

ce que cela signifie pour les développeurs PHP est "vous ne pouvez pas utiliser cette fonction sans la tester d'abord, parce que vous ne pouvez pas dire si libcurl utilise le résolveur de nom de système standard (mais vous pouvez être assez sûr qu'il l'est) "

le problème est que sur (Li|U)nix, quand libcurl utilise le résolveur de noms standard, un SIGALRM est généré lors de la résolution de noms que libcurl pense être l'alarme de timeout.

la solution est de désactiver les signaux en utilisant CURLOPT_NOSIGNAL. Voici un exemple de script qui se demande de causer un délai de 10 secondes pour que vous puissiez tester les temps morts:

<?php
if (!isset($_GET['foo'])) {
        // Client
        $ch = curl_init('http://localhost/test/test_timeout.php?foo=bar');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
        $data = curl_exec($ch);
        $curl_errno = curl_errno($ch);
        $curl_error = curl_error($ch);
        curl_close($ch);

        if ($curl_errno > 0) {
                echo "cURL Error ($curl_errno): $curl_error\n";
        } else {
                echo "Data received: $data\n";
        }
} else {
        // Server
        sleep(10);
        echo "Done.";
}
?>

de http://www.php.net/manual/en/function.curl-setopt.php#104597

20
répondu Simon East 2013-12-09 03:39:10

vous ne pouvez pas exécuter la requête à partir d'un navigateur, il va attendre le serveur exécutant la requête CURL pour répondre. Le navigateur est probablement chronométrage en 1-2 minutes,le délai réseau par défaut.

Vous devez l'exécuter à partir de la ligne de commande/terminal.

8
répondu Brent Baisley 2010-04-06 01:33:07

vous devez vous assurer des temps morts entre vous et le fichier. Dans ce cas, PHP et Curl.

pour dire à Curl de ne jamais temporiser quand un transfert est encore actif, vous devez définir CURLOPT_TIMEOUT à 0 , au lieu de 1000 .

curl_setopt($ch, CURLOPT_TIMEOUT, 0);

en PHP, encore une fois, vous devez supprimer les limites de temps ou PHP lui-même (après 30 secondes par défaut) va tuer le script le long de la requête de Curl. cela seul devrait corriger votre numéro .

En outre, si vous avez besoin d'intégrité des données, vous pouvez ajouter une couche de sécurité en utilisant ignore_user_abort :

# The maximum execution time, in seconds. If set to zero, no time limit is imposed.
set_time_limit(0);

# Make sure to keep alive the script when a client disconnect.
ignore_user_abort(true);

une déconnexion du client interrompt l'exécution du script et peut-être endommager les données,

par exemple. requête de base de données non-transitionnelle, création d'un fichier de configuration, ecc., tandis que dans votre cas, il téléchargerait un fichier partiel... et tu t'en soucieras peut-être, ou pas.

répondant à cette vieille question parce que ce fil est en haut sur les recherches de moteur pour CURL_TIMEOUT .

7
répondu MarcoP 2017-05-14 14:06:53

si vous utilisez PHP comme une application fastCGI, assurez-vous de vérifier les paramètres de délai fastCGI. Voir: PHP curl mis d'erreur 500

3
répondu wbinky 2017-05-23 12:34:27