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

Langage PHP Discussion :

Optimiser les requetes POST et GET


Sujet :

Langage PHP

  1. #1
    Membre régulier
    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é
    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

    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
    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