Page 1 sur 2

pb de timeout requete http

Posté : 21 nov. 2013, 19:17
par Megadeth
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
;)

Re: pb de timeout requete http

Posté : 21 nov. 2013, 19:57
par xTG
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 ?

Re: pb de timeout requete http

Posté : 22 nov. 2013, 10:36
par Megadeth
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
;)

Re: pb de timeout requete http

Posté : 22 nov. 2013, 10:42
par Mazarini
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 ?

Re: pb de timeout requete http

Posté : 22 nov. 2013, 10:42
par sirakawa
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.

Re: pb de timeout requete http

Posté : 22 nov. 2013, 11:35
par Megadeth
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
;)

Re: pb de timeout requete http

Posté : 22 nov. 2013, 11:38
par sirakawa
Je viens de penser à qq ch sans avoir testé:
chercher sur gargarisme.com : php barre de progrès....

Re: pb de timeout requete http

Posté : 22 nov. 2013, 17:05
par Megadeth
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
;)

Re: pb de timeout requete http

Posté : 27 nov. 2013, 13:11
par Megadeth
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
;)

Re: pb de timeout requete http

Posté : 27 nov. 2013, 14:08
par xTG
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).

Re: pb de timeout requete http

Posté : 27 nov. 2013, 16:10
par Megadeth
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"

Re: pb de timeout requete http

Posté : 27 nov. 2013, 16:58
par xTG
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.

Re: pb de timeout requete http

Posté : 28 nov. 2013, 11:39
par Megadeth
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:

Re: pb de timeout requete http

Posté : 28 nov. 2013, 11:51
par Megadeth
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 ?

Re: pb de timeout requete http

Posté : 28 nov. 2013, 12:01
par xTG
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.