steph_o | Bonjour,
J'ai utilisé le script, et j'ai constaté qu'il était lent (réponse qui met un peu de temps à revenir).
En cherchant, j'ai trouvé qu'il manquait une ligne dans le header : Connection: close\r\n\r\n";
J'ai donc continué de l'utiliser, et j'ai ajouter la possibilité de faire des appels avec methode GET, alors je vous en fait profiter (car sans ce script, j'aurai dû avaler les RFC..., et c'est assez indigeste )
C'est en fait un objet (vous pouvez sortir les fonctions si vous voulez) qui dérive d'une classe (perso) SO_Erreur. Cette dernière implémente juste une fonction so_traiteErreur qui affiche un message dans une page html (vous pouvez la remplacer par un echo)
Voici l'objet :
Code :
- <?php
- class SO_Post_Get extends SO_Erreur
- {
- private $balise_debut = "SO_MAJ_DEBUT";
- private $balise_fin = "SO_MAJ_FIN";
- /* so_sendToHost
- * ~~~~~~~~~~
- * Params:
- * $host - Just the hostname. No http:// or
- /path/to/file.html portions
- * $method - get or post, case-insensitive
- * $path - The /path/to/file.html part
- * $data - The query string, without initial question mark
- * $useragent - If true, 'MSIE' will be sent as
- the User-Agent (optional)
- *
- * Examples:
- * sendToHost('www.google.com','get','/search','q=php_imlib');
- * sendToHost('www.example.com','post','/some_script.cgi',
- * 'param=First+Param&second=Second+param');
- *
- * Retourne la chaine réponse ou FALSE si problème connexion
- *
- */
- function so_sendToHost($host,$method,$path,$data)
- {
- $method = strtoupper($method);
- // ajout de balises pour repérer la chaine de retour dans la reponse HTTP
- $data = "balise_debut=".$this->balise_debut."&balise_fin=".$this->balise_fin."&".$data;
- // si methode GET ==> integre $data avec le $path
- if ($method == 'GET')
- {
- $path .= '?'.$data;
- }
- // Header info to connect to the server
- $header = "";
- $header .= "$method $path HTTP/1.1\r\n";
- $header .= "HOST: $host \r\n";
- $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
- $header .= "Content-Length: " . strlen($data) . "\r\n";
- $header .= "Connection: close\r\n\r\n";
- // Ouverture connexion avec serveur
- $fp = fsockopen ($host, 80, $errno, $errstr, 30);
- //Pas de connexion ==> retour erreur
- if (!$fp)
- {
- $message = "Erreur connexion pour appel methode $method : $errno $errstr";
- so_traiteErreur($message);
- return FALSE;
- }
- // si methode POST ==> integre $data après $header
- if ($method == 'POST')
- {
- $header .= $data;
- }
- // envoie requete
- fputs ($fp, $header);
- // evite une éventuelle attente
- flush();
- // Receive POST request
- $reponse = "";
- while ( !feof($fp) )
- {
- $reponse .= fread($fp,128);
- }
- // ferme la connexion
- fclose($fp);
- $this->so_extrait_reponse( $reponse);
- return $reponse;
- }
- /* extrait_reponse
- * ~~~~~~~~~~~~~~~
- * Params:
- * reponse : issue de la requete
- *
- */
- private function so_extrait_reponse(&$reponse)
- {
- $pos_debut = strpos ($reponse, $this->balise_debut);
- $pos_fin = strpos ($reponse, $this->balise_fin);
- if ($pos_debut === FALSE)
- {
- $message = "Erreur réponse script : balise début introuvable";
- so_traiteErreur($message);
- return FALSE;
- }
- if ($pos_fin === FALSE)
- {
- $message = "Erreur réponse script : balise fin introuvable";
- so_traiteErreur($message);
- return FALSE;
- }
- $pos_debut += strlen($this->balise_debut);
- $reponse = substr($reponse, $pos_debut, $pos_fin - $pos_debut);
- return TRUE;
- }
- }
- ?>
|
Le fichier php qui recoit le post ou le get doit encadrer sa réponse avec les balise debut et fin (j'ai fait comme ça car je ne m'en sortait pas du décodage de la réponse avec HTTP...)
Exemple :
Code :
- <?php
- $reponse = "ce que le script veut renvoyer (au pire : rien) mais sous forme de string"
- $sortie=$_POST['balise_debut'].$reponse.$_POST['balise_fin'];
- echo $sortie;
- ?>
|
Attention, le script reçoit les données en POST ici
Pour utiliser l'objet, il faut utiliser le code suivant :
Code :
- <?php
- $objet_post_get = new SO_Post_Get();
- $data = "param1=test1";
- $data .= "¶m2=tes2";
- $url = "/script/script.php";
- $site = "localhost";
- $reponse = $objet_post_get->so_sendToHost($site, "post", $url, $data);
- echo $reponse;
- ?>
|
J'aurais bien aimé utiliser la methode header de PHP, mais aucun succès (et aucun script trouvé sur le net).
Voilà, j'espère que ça vous servira.
|