Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre régulier

    Inscrit en
    mai 2002
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 93
    Points : 83
    Points
    83

    Par défaut Optimiser les requetes POST et GET

    Bonjour,
    J'utilise la methode sendToHost pour envoyer des trucs à des URLs en POST et en GET, voici le code de la methode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    /////////////////////////////////
    	/* sendToHost
    	* ~~~~~~~~~~
    	* Params:
    	*   $host - Just the hostname.  No http:// or /path/to/file.html portions
    	*   $port - default to 80
    	*   $method - get or post, case-insensitive
    	*   $path - The /path/to/file.html part
    	*   $data - The query string, without initial question mark
    	*
    	* Examples:
    	*   sendToHost('www.google.com',80,'get','/search','q=php_imlib');
    	*   sendToHost('www.example.com',80,'post','/some_script.cgi',
    	*              'param=First+Param&second=Second+param');
    	*/
    	private function sendToHost($host,$port=80,$method,$path,$data) {
    		$buf = '';
     
    		if (empty($method)) $method = 'GET';
    		$method = strtoupper($method);
    		if ($method == 'GET') $path .= '?' . $data;
     
    		$fp = fsockopen($host,$port);
     
    		if ($fp) {
    			fputs($fp, "$method $path HTTP/1.1\r\n");
    			fputs($fp, "Host: $host\r\n");
    			fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
    			if ($method == 'POST') fputs($fp, "Content-length: " . strlen($data) . "\r\n");
    			fputs($fp, "Connection: close\r\n\r\n");
    			if ($method == 'POST') fputs($fp, $data);
     
    			$buf = '';
    			while (!feof($fp))
    			$buf .= fgets($fp,128);
    			fclose($fp);
    		}
     
    		return $buf;
    	}
    ca fonctionne avec une ouverture de socket à bas niveau (plus ou moins ) avec fsockopen, l'action d'envoie prends un peux de temps et ca commence à gener lorsque je voudrais faire des requetes massives.
    J'ai bien chercher à remplacer celle la, j'hésite entre utilise CURL et file_get_contents sachant que cette derniére ne transfére pas de requetes en POST, mais ca reste possible de combiner les deux (GET en file_get_contents et POST en autres).
    C'est les deux autres methodes que je connais, dites moi si y'en à d'autres, sinon mon probléme c'est chercher la meilleur methode en terme de vitesse d'envoi (mon objectif c'est d'atteindre un grand flux d'envoi).
    Merci pour votre aide.

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : janvier 2004
    Messages : 1 249
    Points : 1 536
    Points
    1 536

    Par défaut

    J'ai bien 2 petites idées, mais j'ai jamais testé, donc faudrait voir...

    en fait ca depend de ce que tu veux faire.
    A) Si tu veux envoyer une grosse requete a un serveur, je ne vois pas comment tu pourrais ameliorer les choses... puisque tu reste lié au temps d'execution de ta requete par le serveur distant. Tu peux utiliser la methode de B) si tu ne fait aucun controle d'erreur...

    B) Si tu veux envoyer plusieurs requetes (plus ou moins grosses) sur un ou plusieurs serveurs, tu pourrais peut etre essayer de les envoyer "en parallele" si c'est possible.
    En effet, en rendant la methode fsockopen() non bloquante grace a :
    http://fr.php.net/manual/fr/function...t-blocking.php

    puis en définissant des methodes appellées sur certains evenements grace a :
    http://fr.php.net/manual/fr/function...r-register.php

    On pourrait imaginer que tu envoie 10 requetes en meme temps sans attendre leurs retour, puis les relance eventuellement si certaines echouent grace a stream_wrapper_register

    Cela voudrais quand meme dire que le process php devient multithread... je ne sais donc pas si ca va marcher correctement ni quels sont alors ses conditions de terminaison...

  3. #3
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    février 2004
    Messages
    13 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : février 2004
    Messages : 13 722
    Points : 29 845
    Points
    29 845

    Par défaut

    Salut

    Autre chose : d'habitude, il est conseillé d'utiliser des fonctions du plus bas niveau possible si on cherche la rapidité. Cela implique d'oublier cURL car il me semble que c'est une sorte de wrapper (qui dit wrapper dit couche supplémentaire, donc couche non fondamentale).

  4. #4
    Membre régulier

    Inscrit en
    mai 2002
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 93
    Points : 83
    Points
    83

    Par défaut

    Je ne vois pas comment je pourrais utiliser stream_set_register() dans ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    		$fp = fsockopen($host,$port);
     
    		if ($fp) {
    			stream_set_blocking($fp, true);
    			fputs($fp, "$method $path HTTP/1.1\r\n");
    			fputs($fp, "Host: $host\r\n");
    			fputs($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
    			fputs($fp, "Content-length: " . strlen($data) . "\r\n");
    			fputs($fp, "Connection: close\r\n\r\n");
    			fputs($fp, $data);
     
    			// voici le blockage :
    			$buf = '';
    			while (!feof($fp))
    			$buf .= fgets($fp,128);
    			fclose($fp);
    		}
    comment je peux utiliser la partie du code qui récupére le retour de la socket dans un wrapper ?
    merci

Discussions similaires

  1. Passer les requetes GET et POST en UTF-8
    Par deudtens dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 05/05/2008, 09h08
  2. les méthodes POST et GET
    Par kei2906 dans le forum Débuter
    Réponses: 5
    Dernier message: 12/02/2008, 17h14
  3. récuperer les valeurs post ou get d'un formulaire
    Par matoon dans le forum Balisage (X)HTML et validation W3C
    Réponses: 13
    Dernier message: 22/01/2008, 18h34
  4. Recupérer toutes les requetes post
    Par blabla33 dans le forum Formulaires
    Réponses: 4
    Dernier message: 03/08/2007, 14h58
  5. Réponses: 22
    Dernier message: 17/03/2006, 21h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo