pb de timeout requete http

Mammouth du PHP | 737 Messages

21 nov. 2013, 19:17

Bonsoir,

Je ne sais pas si quelqu'un a déjà rencontré le souci mais je voudrais couper la chique à une requête qui tourne tant que le timeout n'est pas atteint.

Comment puis-je faire ? Y a t-il une fonction pour calculer si mon serveur reçoit de l'info ou pas et ensuite couper la connexion à la ressource distante pour afficher les éléments de ma page ?

Par avance merci de votre précieuse aide.

Mega
;)
Dyslexics are teople poo

ViPHP
xTG
ViPHP | 7331 Messages

21 nov. 2013, 19:57

A ma connaissance non il n'y a rien pour renvoyer une requête HTTP incomplète (ça a peu d'intérêt en fait...).
Pourquoi ne pas te tourner vers de l'ajax avec des appels asynchrones pour récupérer tes données par itération ?

Mammouth du PHP | 737 Messages

22 nov. 2013, 10:36

Bonjour xTG, toujours les mêmes ^^, merci !

Est-ce qu'il n'y a pas un moyen de calculer le poids total d'un fichier distant et de dire, ok c'est téléchargé et je peux tuer la requête sans attendre le timeout.

Dois-je me tourner vers CURL ?

Mega
;)
Dyslexics are teople poo

ViPHP
ViPHP | 2577 Messages

22 nov. 2013, 10:42

La requête ne se termine pas toute seule une fois qu'elle a terminé son travail ?
Ne serait ce pas un problème de code qui s'exécute après le traitement de la requête pour faire des taches complémentaires de type cron ?

Mammouth du PHP | 2278 Messages

22 nov. 2013, 10:42

Je crains que ce ne soit pas simple:
ceretains téléchargements procèdent en deux temps:
transfert du fichier depuis la machine distante dans un répertoire temporaire (et si on arrêtait le script ici, il faudrait aller à la pêche)
déplacement jusqu'au répertoire désiré.
Je me demande si tous les navigateurs procèdent de la même façon.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 737 Messages

22 nov. 2013, 11:35

Bonjour, c'est cool tout ce soutien.

J'utilise à la fin un simple file_get_contents.

En fait je passe par des webservices distants mais il y a une connexion qui n'est pas fermée et mon idée était d'aposer mon propre timeout ou bien de tester si le serveur distant m'envoyait encore des choses, sinon je cut. Vous m'suivez ?

Mega
;)
Modifié en dernier par Megadeth le 22 nov. 2013, 11:51, modifié 1 fois.
Dyslexics are teople poo

Mammouth du PHP | 2278 Messages

22 nov. 2013, 11:38

Je viens de penser à qq ch sans avoir testé:
chercher sur gargarisme.com : php barre de progrès....
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 737 Messages

22 nov. 2013, 17:05

J'ai beau cherché je ne vois pas ce qui bloque, j'ai essayé un peu de curl, fsockopen, des vieilles fonctions de ripat, rien n'y fait.

Je ne comprends déjà pas pourquoi mon timeout et mon connection close ne sont pas pris en compte.

Comment reprendre la main sur mon file_get_contents et catcher le content-length ?

Mega
;)
Dyslexics are teople poo

Mammouth du PHP | 737 Messages

27 nov. 2013, 13:11

Re,

Je progresse doucement sur le sujet et voulais savoir comment passer de la fonction file_get_contents à un résultat CURL qui semblerait être la solution à mon problème.

Voilà ce que j'ai pour le moment :
$mavar=file_get_contents("https://monurl...id=".$truc,false,$contexte);
et je "voudrais" le même résultat avec les fonctions curl, j'ai ceci pour le moment.
$href = "https://monurl...id=".$truc;
$posts = "";

$ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $href);
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
        curl_setopt($ch, CURLOPT_HEADER, 1);
        if ($posts!=""){
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $posts);
        }
        curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($ch, CURLOPT_TIMEOUT, 2);
        $result=curl_exec($ch);			
        curl_close($ch);
L'idée est de créer le lien, couper la chique pour reprendre la main.

Merci.

Mega
;)
Dyslexics are teople poo

ViPHP
xTG
ViPHP | 7331 Messages

27 nov. 2013, 14:08

Tu peux avoir des informations de retour avec : http://www.php.net/manual/fr/function.curl-getinfo.php
Ainsi tu sauras si dans $result tu as le retour complet ou bien si tu n'as rien d'exploitable (notamment si CURLINFO_TOTAL_TIME est égal à ton timeout).

Mammouth du PHP | 737 Messages

27 nov. 2013, 16:10

Re xTG, mauvaise utilisation ou quoi ...

$info = curl_getinfo($ch);
echo 'La requête a mis ' . $info['total_time'] . ' secondes à être envoyée à ' . $info['url'];
var_dump($info);

Résultat :

La requête a mis 0 secondes à être envoyée à https://monurl...id=".$truc array(20) { ["url"]=> string(97) "https://monurl...id=".$truc" ["content_type"]=> NULL ["http_code"]=> int(0) ["header_size"]=> int(0) ["request_size"]=> int(0) ["filetime"]=> int(-1) ["ssl_verify_result"]=> int(0) ["redirect_count"]=> int(0) ["total_time"]=> float(0) ["namelookup_time"]=> float(10.004399) ["connect_time"]=> float(0) ["pretransfer_time"]=> float(0) ["size_upload"]=> float(0) ["size_download"]=> float(0) ["speed_download"]=> float(0) ["speed_upload"]=> float(0) ["download_content_length"]=> float(0) ["upload_content_length"]=> float(0) ["starttransfer_time"]=> float(0) ["redirect_time"]=> float(0) }

:-k

Ps : print curl_error($ch); retourne "Connection time-out"
Dyslexics are teople poo

ViPHP
xTG
ViPHP | 7331 Messages

27 nov. 2013, 16:58

Restes plus qu'à confirmer que la structure n'est pas remplie lors d'un timeout. :mrgreen:

Peut être faire un curl sur une url qui répond en temps dans un premier lieu ?
Puis tenter de mixer les deux pour voir le contenu de cette structure et comment elle évolue.

Mammouth du PHP | 737 Messages

28 nov. 2013, 11:39

Bonjour,

Désolé, je ne comprends pas bien, c'est un peu le flou artistique.

Pour toi, je n'arriverai pas à mes fins avec file_get_contents ?

Ceci devrait fonctionner normalement :
// Création du contenu brut de la requête
$strContenu=http_build_query($tvarDonnees);
	
// Définition des headers
$headers = http_build_headers( array(
'Content-Type' => 'application/x-www-form-urlencoded',
'Content-Length' => strlen( $strContenu)),'Connection: close' );
 
// Définition du contexte
$options = array( 'http' => array( 'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0',
'host' => 'monhote',
'method' => 'POST',
'protocol_version' => '1.1',
'timeout' => '3',
'content' => $strContenu,
'header' => $headers ) );
 
// Création du contexte
$contexte = stream_context_create( $options );
 
// Envoi du formulaire POST
$strRetour = file_get_contents( "https://monurl?id=..., false, $contexte );
Ca fonctionne mais qu'au bout d'une vingtaine de secondes :cry:
Dyslexics are teople poo

Mammouth du PHP | 737 Messages

28 nov. 2013, 11:51

Je complète le post ci-dessus avec curl je ne peux pas passer le contexte comme dans file_get_contents, comment on fait via curl pour passer le $contexte qui constitue ma requête en somme ? Tu m'suis ?
Dyslexics are teople poo

ViPHP
xTG
ViPHP | 7331 Messages

28 nov. 2013, 12:01

Ca fonctionne mais qu'au bout d'une vingtaine de secondes :cry:
Bah un webservice ça répond pas en 0 seconde à ce que je sache non ?
Donc je dirai qu'il met 20 secondes à te répondre tout simplement...
Ou bien que la réponse passe par des chemins fortement engorgé (côté du webservice ou côté de ton serveur) ce qui ralenti d'autant plus le temps de réponse.
Enfin après on part dans des problèmes d'administration réseau...

Pour ton autre question je serai tenté de répondre RTFM... ;)
CURLOPT_HTTPHEADER
CURLOPT_POST
ect
Il y a tout ce qu'il faut dans la documentation pour remplir l'entête HTTP.