Lagestiondes protocolesHTTP, FTP,SOAP,etc.

46
Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc. 16.1 Fonctions réseau (de base) .................................. 1265 16.2 Réseau ............................................... 1265 16.3 Les sockets ............................................ 1270 16.4 FTP ................................................. 1275 16.5 cURL (client URL Library) ................................... 1288 16.6 SOAP ................................................ 1299

Transcript of Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Page 1: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Chapitre 16

La gestion desprotocoles HTTP,

FTP, SOAP, etc.16.1 Fonctions réseau (de base) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1265

16.2 Réseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1265

16.3 Les sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1270

16.4 FTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1275

16.5 cURL (client URL Library) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1288

16.6 SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1299

Page 2: Lagestiondes protocolesHTTP, FTP,SOAP,etc.
Page 3: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

16.1. Fonctions réseau (de base)

16.2. RéseauLes fonctions présentées dans ce chapitre ne permettent pas de réels développements, maisconstituent une "trousse à outils" parfois nécessaire dans la manipulation d’informations réseau(comme ce peut être le cas, par exemple, avec l’utilisation des sockets). Elles ne nécessitentaucune installation particulière.

Adresses IP et DNSL’opération la plus souvent sollicitée est certainement celle qui consiste à déterminer l’adresseIP d’une machine lorsque l’on ne connaît que son nom. Pour cela, vous disposez de la fonctiongetHostByName().

getHostByName()Retourne l’adresse IP de la machine précisée par son nom.

Syntaxe string getHostByName(string $nomMachine)

$nomMachine Nom de la machine.

retour Adresse IP de la machine, ou $nomMachine si aucune adresse IP n’a puêtre trouvée.

Ainsi, le code suivant :

<?phpecho getHostByName("localhost");

?>

retournera très probablement :

127.0.0.1

Alors que :

<?phpecho getHostByName("www.php.net");

?>

retournera une adresse IP publique comme, par exemple,

208.210.50.161

1265

Réseau16.La

gestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 4: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Il est également possible de réaliser l’opération inverse, à savoir récupérer un nom de machineà partir de son adresse IP grâce à getHostByAddr().

getHostByAddr()Retourne un nom de machine associé à l’adresse IP précisée (tel qu’on le trouve dans le fichier/etc/hosts des sytèmes UNIX/Linux).

Syntaxe string getHostByAddr(string $adresseIP)

$adresseIP Adresse IP de la machine.

retour Nom associé à la machine, ou $adresseIP si aucun nom n’a pu êtretrouvé.

Le code suivant :

<?phpecho getHostByAddr("127.0.0.1");

?>

pourra retourner :

localdomain.localhost

On notera au passage que l’opération n’est pas nécessairement réversible. SigetHostByName("localhost") retourne "127.0.0.1" cela n’implique pas quegetHostByAddr("127.0.0.1") retourne "localhost". En effet, une machine peut avoirplusieurs noms (via des alias), et c’est donc le nom principal qui est retourné pargetHostByAddr().

De même, une unique machine peut posséder plusieurs adresses IP. Pour en déterminer la liste,vous pouvez faire appel à getHostByNameL().

getHostByNameL()Retourne la liste des adresses IP de la machine précisée par son nom.

Syntaxe array getHostByNameL($nomMachine)

$nomMachine Nom de la machine.

retour Tableau indexé des adresses IP de la machine, ouFALSE si aucune adresseIP n’a pu être trouvée.

PHP dispose de fonctions permettant de convertir des adresses IP précisées sous la forme"classique" xxx.xxx.xxx.xxx en adresses sous la forme d’entiers, et réciproquement.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1266

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 5: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

ip2long()Convertit une adresse IP du format "xxx.xxx.xxx.xxx" en un entier.

Syntaxe : int ip2long(string $adresseIP)

$adresseIP Adresse IP au format "xxx.xxx.xxx.xxx".

retour Adresse IP sous forme d’un entier.

Entier signé ou nonUn simple echo du résultat fourni par ip2long peut conduire à l’affichage d’un entiernégatif. Or celui-ci est théoriquement non signé. Il est donc préférable de faire appelà printf("%u", ip2long($adresseIP)).

long2ip()Convertit une adresse IP d’entier au format "xxx.xxx.xxx.xxx".

Syntaxe int ip2long(string $adresseIP)

$adresseIP Adresse IP sous forme d’un entier.

retour Adresse IP au format "xxx.xxx.xxx.xxx".

Dans certaines circonstances, comme par exemple pour déterminer si une adresse e-mail a deschances d’être valide, il peut être utile de déterminer si le nom de domaine indiqué existe, ou,plus précisément, vérifier si ce nom est connu du DNS.

DNSDNS sont les initiales anglaises de "Domain Name Server", autrement dit "Serveur denom de domaine". En deux mots, ce serveur contient les tables de correspondancesqui permettent de retrouver une machine (ou son adresse IP) à partir de son nom.Vous trouverez plus d’informations sur le site Internet :http://www.nic.fr/guides/dns-intro.

Pour tester la présence d’un nom de machine auprès du DNS vous ferez appel àcheckDNSRR().

checkDNSRR() (non disponible sous Windows)Teste la présence d’un nom de machine ou d’une adresse IP auprès du DNS. Notez que dans laversion 5 de PHP, cette fonction est baptisée DNS_check_record() (tout en assurant lacompatibilité).

Réseau

1267

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 6: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Syntaxe boolean checkDNSRR(string $nomMachine [, string $type])

$nomMachine Nom de la machine ou adresse IP.

$type Précise le type d’entrée recherchée (par défaut MX) :A (Address = Adresse) : une simple adresse.CNAME (Cannonical Name = Nom canonique) : un alias.MX (Mail eXchanger = Distributeur de courrier) : machine permettant laréception de mails.NS (Name Server = Serveur de nom) : un serveur de nom.PTR (Pointer = Pointeur) : un renvoi sur une autre machine.SOA (Start Of Authority) : une zone.ANY : l’ensemble des options précédentes.

retour TRUE si la machine est connue du DNS (pour le type précisé), FALSEsinon.

Voici donc une petite fonction permettant non pas de vérifier la validité d’une adresse e-mail,mais de débusquer certaines adresses manifestement non valides.

<?phpfunction testEmail($email){

$domaine = strstr($email, ’@’);return checkdnsrr($domaine, ’MX’);

}$email = "[email protected]";if (testEmail($email)) {

echo "Je ne peux pas assurer que cette adresse email est valide "."mais elle n’est pas totalement farfelue";

} else {echo "Pfuuu... C’est n’importe quoi cet email, ".

"jamais je ne pourrai envoyer d’email à cette adresse";}

?>

Pour ce qui concerne les entrées MX du fichier de configuration du DNS, il est possible d’ensavoir un peu plus grâce à la fonction getMXRR().

getMXRR() (Non disponible sous Windows)Retourne la liste des machines enregistrées auprès du DNS pour la gestion des mails. Notezque dans la version 5 de PHP, cette fonction est baptisée DNS_get_mx() (tout en assurant lacompatibilité).

Syntaxe boolean getMXRR(string $nomMachine, array &$machines [, array&$poids])

$nomMachine Nom de la machine.

$machines Référence sur une variable dans laquelle sera copié un tableau indexécontenant les noms des machines devant "router" les mails.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1268

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 7: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

$poids Référence sur une variable dans laquelle sera copié un tableau indexécontenant les poids associés aux machines. Les mails serontprioritairement "routés" par la machine de plus faible poids.

retour TRUE si la machine est connue du DNS, FALSE sinon.

Protocoles et servicesPHP propose également des fonctions permettant de récupérer des informations plusintimement liées au serveur.

Il est, par exemple, possible de connaître le port associé à un service ou, inversement, deretrouver le nom d’un service à partir de son numéro de port.

getServByName()Retourne le port associé au service donné.

Syntaxe int getServByName(string $service, string $protocole)

$service Nom du service (ex. : "ftp", "http", ...)

$protocole Nom du protocole ("tcp" ou "udp").

retour Numéro de port, ou FALSE en cas d’échec.

getServByPort()Retourne le nom du service associé au port donné.

Syntaxe int getServByPort(string $port, string $protocole)

$port Numéro du port.

$protocole Nom du protocole ("tcp" ou "udp").

retour Nom du service, ou FALSE en cas d’échec.

Ainsi, pour connaître le port associé au service FTP, ou le nom du service associé au port 80,l’on pourra utiliser le script suivant :

<?phpecho getServByName("ftp", "tcp")."<br />";echo getServByPort(80, "tcp");

?>

ce qui retournera (probablement) :

21http

Réseau

1269

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 8: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Il est également possible de connaître le numéro associé à un protocole ou, inversement, deretrouver le nom d’un protocole à partir de son numéro.

getProtoByName()Retourne le numéro associé à un nom de protocole (tel qu’on le trouve dans le fichier/etc/protocols des systèmes UNIX/Linux).

Syntaxe int getProtoByName(string $nomProtocole)

$nomProtocole Nom du protocole.

retour Numéro du protocole, ou −1 s’il n’existe pas.

getProtoByNumber()Retourne le nom associé à un numéro de protocole (tel qu’on le trouve dans le fichier/etc/protocols des systèmes UNIX/Linux).

Syntaxe int getProtoByNumber(string $numeroProtocole)

$numeroProtocole Numéro du protocole.

retour Nom du protocole, ou FALSE s’il n’existe pas.

Voici un exemple d’utilisation.

Le script suivant :

<?phpecho getProtoByName("tcp")."<br />";echo getProtoByNumber(62)."<br />";?>

pourra retourner :

6cftp

16.3. Les socketsPour communiquer directement avec un service d’une machine donnée, vous serez peut-êtreamené à utiliser les sockets. Vous pouvez ainsi communiquer directement avec un serveur FTP,HTTP, NNTP (newsgroup), etc , et maîtriser plus finement les opérations que si vous utilisiezles commandes de plus haut niveau (plus couramment utilisées).

Le principe d’utilisation est simple et se déroule en quatre grandes étapes :

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1270

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 9: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

j Ouverture de la connexion ;

j Configuration de la connexion ;

j Lecture/écriture sur la socket ;

j Fermeture de la connexion.

Un exemple d’application est donné à la fin de ce sous-chapitre.

Ouverture de la connexionL’ouverture d’une connexion se fait via la fonction fSockOpen().

fSockOpen()Ouvre une connexion sur une socket.

Syntaxe resource fSockOpen(string $serveur, int $port [, int&$codeErreur [, string &$msgErreur [, double$delaiExpiration]]])

$serveur Nom du serveur sur lequel doit se porter la connexion (éventuellementprécédé de "udp://" pour une connexion UDP).

$port Numéro du port sur lequel établir la connexion.

$codeErreur Référence sur une variable dans laquelle sera copié le code d’erreur levé.

$msgErreur Référence sur une variable dans laquelle sera copié le message d’erreur levé.

$delaiExpiration Délai (en secondes) au-delà duquel la tentative de connexion doit êtreabandonnée (par défaut 60 secondes).

retour Identifiant de connexion à la socket, ou FALSE en cas d’erreur.

La fonction fSockOpen() possède un équivalent permettant l’ouverture d’une connexionpersistante (nous n’avons pas vérifié le caractère persistant et réutilisable de la connexion). Ils’agit de la fonction pFSockOpen(), qui possède exactement la même syntaxe quefSockOpen().

Configuration de la connexionIl est possible de jouer sur deux paramètres de connexion :

j Le mode de lecture bloquant ou non ;

j Le délai d’expiration (timeout) de la socket.

La lecture est dite en mode bloquant si la fonction de lecture doit attendre qu’un message luisoit adressé pour "rendre la main" au programme. Dans le cas contraire, elle est dite nonbloquante, et la fonction de lecture retourne simplement le contenu de la mémoire tampon

Les sockets

1271

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 10: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

(espace stockant les messages nouvellement reçus) qui pourra éventuellement être vide (si lemessage n’est pas encore arrivé).

Par défaut, en l’absence d’appel à la fonction socket_set_blocking(), le mode de lecture estbloquant.

socket_set_blocking()Détermine si le mode de lecture de la socket doit être ou non bloquant.

Syntaxe boolean socket_set_blocking(resource $idSocket, boolean$modeLecture)

$idSocket Identifiant de la socket tel que retourné par fsockopen().

$modeLecture TRUE si le mode de lecture doit être bloquant, FALSE sinon.

retour FALSE en cas d’échec, TRUE sinon.

La durée de vie de la connexion à la socket peut être limitée par la fonctionsocket_set_timeout().

socket_set_timeout()Détermine la durée de vie maximale de la socket.

Syntaxe boolean socket_set_timeout(resource $idSocket, int $secondes,int $microsecondes)

$idSocket Identifiant de la socket tel que retourné par fsockopen().

$secondes Partie "secondes" de la durée de vie de la socket exprimée en"secondes:microsecondes".

$microsecondes Partie "microsecondes" de la durée de vie de la socket exprimée en"secondes:microsecondes".

retour FALSE en cas d’échec, TRUE sinon.

Lecture/écriture sur la socketLa lecture et l’écriture sur la socket s’effectuent à l’aide des fonctions qui ont déjà été vues dansle chapitre relatif aux fichiers.

Vous pourrez ainsi utiliser fGets($idSocket, $nbOctets); pour lire jusqu’à $nbOctetsoctets sur la socket, fPuts($idSocket, $chaine); pour envoyer au serveur une chaîne decaractères via la socket, ou encore fEOF($idSocket); pour tester si la fin de fichier (find’émission) a été atteinte.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1272

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 11: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Fermeture de la connexionLe fermeture de la connexion s’opère exactement de la même façon que celle d’un fichier,c’est-à-dire par la commande fClose($idSocket).

Informations sur la connexionPour connaître l’état d’une socket, vous pouvez faire appel à la fonctionsocket_get_status().

socket_get_status()Retourne quelques informations sur l’état de la socket.

Syntaxe array socket_get_status(resource $idSocket)

$idSocket Identifiant de la socket tel que retourné par fsockopen().

retour Tableau associatif possédant les clés :"time_out" associée à une valeur de type booléen précisant si la durée devie de la socket a expiré ou non."blocked" associée à une valeur de type booléen précisant si la lecture surla socket se fait en mode bloquant ou non."eof" associée à une valeur de type booléen précisant si un indicateur defin de fichier a été détecté ou non."unread_bytes" associée à une valeur de type entier précisant lenombre d’octets actuellement dans la mémoire tampon de lecture de lasocket.

ApplicationPour mettre en place une communication via une socket, l’essentiel est de bien connaître lelangage de communication avec le serveur. Si vous avez conçu votre propre serveur, vous savezcertainement comment il fonctionne… autrement, il faut se référer aux spécifications.

Dans le cas d’un serveur HTTP, le principe est assez simple et a été évoqué dans le chapitreEn-têtes.

Vous pouvez vous reporter à l ’annexe "Les en-têtes" pour plus de détails.

Pour récupérer un document via la méthode GET, il suffit de lui envoyer les instructions "GET<nom du document> HTTP/<norme HTTP>", et, dans le cas de la norme 1.1, il faut au minimumcommuniquer l’en-tête Host. Pour récupérer la page d’accueil d’un site, il faudra donc, parexemple, envoyer les instructions suivantes :

GET / HTTP/1.1Host: localhost

Les sockets

1273

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 12: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

ce qui nous donne le script suivant :

Listing 16.1 : socket_01.php

<?php

// Exemple de récupération d’un document via HTTP// en utilisant directement les sockets.

$serveur = "www.gnu.org";$document = "/";

echo "<b>Lecture de $serveur$document</b><br />";

$idSocket = fSockOpen($serveur, 80, $codeErreur, $msgErreur);if (!$idSocket) {

echo "La connexion via la socket a échouée.<br />";echo "Code d’erreur: $codeErreur<br />";echo "Message d’erreur: $msgErreur<br />";die();

}

// Configuration de la connexion// en mode bloquant// et avec un timeout de 5 minutessocket_set_blocking($idSocket, TRUE);socket_set_timeout($idSocket, 5, 0);

// Envoi de données au serveurfputs($idSocket, "GET $document HTTP/1.1\r\n");fputs($idSocket, "Host: localhost\r\n");fputs($idSocket, "\r\n"); // Marque la fin de l’en-tête

// Lecture de la réponsewhile (!feof($idSocket)) {

$donnees = fgets($idSocket, 512);echo "<xmp>$donnees</xmp>"; // Affichage du code source

}?>

qui fournira, par exemple, le résultat suivant (début de la réponse uniquement) :

Lecture de www.gnu.org/HTTP/1.1 200 OKDate: Tue, 28 May 2002 15:39:34 GMTServer: Apache/1.3.24 (Unix) Debian GNU/Linux mod_python/2.7.8 Python/1.5.2Last-Modified: Fri, 24 May 2002 17:51:38 GMTETag: "1088107-2e6e-3cee7daa"Accept-Ranges: bytesContent-Length: 11886Content-Type: text/html

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1274

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 13: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD><TITLE>GNU’s Not Unix! - the GNU Project and the Free Software Foundation(FSF)</title><META HTTP-EQUIV="Keywords"CONTENT="GNU, FSF, Free Software Foundation, Linux, Emacs, GCC, Unix,

Free Software, Operating System, GNU Kernel, HURD, GNU HURD"><META HTTP-EQUIV="Description"CONTENT="Since 1983, developing the free Unix-like operating system GNU,

Comme vous pouvez le constater, nous récupérons ainsi non seulement le code source HTMLde la page, mais également l’en-tête retourné par le serveur (le début du code source setrouvant juste après la première ligne laissée vide).

L’utilisation des sockets permet ici de récupérer l’en-tête retourné par le serveur (et ainsi, parexemple, de vérifier le "Content-type"), mais aussi de préciser notre propre en-tête de requête(en utilisant par exemple le "User-agent" d’Internet Explorer ou de Mozilla, et en testantdifférentes valeurs pour "Accept-Language", etc.).

16.4. FTPLes fonctions de la bibliothèque FTP permettent d’accéder en tant que client à un serveur FTP.

Installation

Sous WindowsQue ce soit avec l’archive du PHP Group ou avec EasyPHP, les fonctions FTP sont intégréesà PHP.

Sous LinuxVous devrez recompiler PHP avec l’option −−enable−ftp (avec les versions 3 de PHP, ils’agissait de l’option −−with−ftp).

Vous pouvez vous reporter au chapitre "Prise en main" pour plus de détails sur lafaçon de compiler PHP.

VérificationPour vérifier que le support FTP est activé, appelez un script contenant <?php phpinfo(); ?>.Celui-ci doit alors laisser apparaître :

FTP

1275

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 14: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Les fonctions de base

Connexion/déconnexionLa première étape consiste, comme toujours, à se connecter au serveur.

ftp_connect()Permet de se connecter à un serveur FTP.

Syntaxe resource ftp_connect(string $serveur [, int $port [, int$delaiExpiration]])

$serveur Adresse du site FTP.

$port Port du serveur FTP si celui-ci est différent du port usuel 21.

$delaiExpiration Temps en secondes pour toute commande avant abandon ; par défautcette valeur vaut 90 secondes.

retour Un identifiant de connexion ou FALSE en cas d’erreur.

Une fois connecté, il faut s’identifier (sans quoi rien n’est possible).

ftp_login()Identification auprès du serveur.

Syntaxe boolean ftp_login(resource $idConnexion, string $identifiant,string $motDePasse)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$identifiant Identifiant (login) de l’utilisateur.

$motDePasse Mot de passe utilisateur.

retour TRUE si la connexion a pu se faire, FALSE sinon.

La déconnexion s’effectuera, quant à elle, grâce à la fonction ftp_close().

Figure 16.1 :phpinfo() FTP

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1276

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 15: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

ftp_close()Permet de clore la connexion FTP.

Syntaxe boolean ftp_close(resource $idConnexion)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

retour TRUE en cas de succès.

ftp_close() possède un alias appelé ftp_quit().

Déplacement dans l’arborescenceUne fois que l’on est identifié, il est possible d’effectuer toutes les opérations courantes enligne, comme, par exemple, changer de répertoire :

ftp_chdir()Permet de changer de répertoire.

Syntaxe boolean ftp_chdir(resource $idConnexion, string $repertoire)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$repertoire Répertoire de destination.

retour TRUE en cas de succès, FALSE sinon.

De son côté, ftp_cdup() permet de monter d’un niveau dans la hiérarchie des répertoires.

ftp_cdup()Change de répertoire pour monter d’un niveau.

Syntaxe boolean ftp_cdup(resource $idConnexion)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

retour TRUE en cas de succès, FALSE sinon.

Liste du contenu d’un répertoireIl est possible également de voir le contenu d’un répertoire :

FTP

1277

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 16: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

ftp_rawlist()Permet d’obtenir une liste détaillée des fichiers d’un répertoire (et éventuellement de sessous-répertoires). Le résultat est identique à ls –l.

Syntaxe array ftp_rawlist(resource $idConnexion, string $repertoire [,boolean $recursif])

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$repertoire Répertoire à lister.

$recursif TRUE si le contenu des sous-répertoires doit également être retourné,FALSE (valeur par défaut) sinon. (Option disponible depuis PHP 4.3.0)

retour Tableau indexé des différents fichiers du répertoire avec leur détail(droits, taille, date).

ftp_nlist()Permet d’obtenir une liste des fichiers d’un répertoire. Le résultat est identique à ls.

Syntaxe array ftp_nlist(resource $idConnexion, string $repertoire)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$repertoire Répertoire à lister.

retour Tableau des différents fichiers du répertoire.

Création, suppression, renommage

ftp_mkdir()Création d’un nouveau répertoire.

Syntaxe boolean ftp_mkdir(resource $idConnexion, string $repertoire)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$repertoire Nom du répertoire à créer avec, éventuellement, son chemin.

retour TRUE si le répertoire a pu être créé, FALSE sinon.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1278

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 17: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

ftp_rmdir()Permet d’effacer un répertoire vide.

Syntaxe boolean ftp_rmdir(resource $idConnexion, string $chemin)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$chemin Répertoire à effacer avec, éventuellement, son chemin.

retour TRUE si le répertoire a été effacé, FALSE sinon.

ftp_delete()Permet d’effacer un fichier.

Syntaxe boolean ftp_delete(resource $idConnexion, string $chemin)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$chemin Chemin du fichier à effacer avec, éventuellement, son chemin.

retour TRUE si le fichier a été effacé, FALSE sinon.

ftp_rename()Permet de renommer un fichier ou un répertoire.

Syntaxe boolean ftp_rename(resource $idConnexion, string $ancienNom,$nouveauNom)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$ancienNom Ancien nom du fichier ou répertoire.

$ancienNom Nouveau nom du fichier ou répertoire.

retour TRUE si le fichier ou répertoire a pu être renommé, FALSE sinon.

Transfert de fichiersLes fonctions de transfert de fichiers sont également disponibles. Il est ainsi possible de copierun fichier du serveur FTP vers le serveur web (ftp_get()) ou le contraire (ftp_put()).

ftp_get()Permet de récupérer un fichier d’un serveur FTP.

FTP

1279

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 18: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Syntaxe boolean ftp_get(resource $idConnexion, string$cheminFichierLocal, string $cheminFichierDistant, int $mode[, int $offset])

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$cheminFichierLocal Chemin avec le nom du fichier où enregistrer le fichier.

$cheminFichierDistant Chemin avec le nom du fichier à récupérer.

$mode FTP_ASCII (pour les fichiers textes) ou FTP_BINARY (pour les fichiersbinaires).

$offset Position dans le fichier distant du premier octet à transférer. (Paramètreajouté depuis PHP 4.3.0)

retour TRUE si le fichier a pu être copié, FALSE sinon.

ftp_put()Télécharge un fichier du serveur web vers le serveur FTP.

Syntaxe boolean ftp_put(resource $idConnexion, string $fichierDistant,string $fichierLocal, int $mode [, int $offset])

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$fichierDistant Destination sur le serveur web.

$fichierLocal Chemin sur le serveur web local.

$mode FTP_ASCII (pour les fichiers textes) ou FTP_BINARY (pour les fichiersbinaires).

$offset Position dans le fichier local du premier octet à transférer. (Paramètreajouté depuis PHP 4.3.0)

retour TRUE si le fichier a pu être copié, FALSE sinon.

Les fonctions ftp_get() et ftp_put() possèdent des variantes permettant d’utiliser unpointeur vers un fichier. Cela permet de garder le fichier accessible en lecture ou écriture unefois copié.

ftp_fget()Permet de télécharger un fichier d’un serveur FTP dans un fichier (ou plus généralement unstream) ouvert.

Syntaxe boolean ftp_fget(resource $idConnexion, resource $idFichier,string $fichierDistant, int $mode [, int $offset])

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$idFichier Identifiant (obtenu par fopen()) du fichier à remplir.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1280

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 19: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

$fichierDistant Nom du fichier distant à récupérer.

$mode FTP_ASCII (pour les fichiers textes) ou FTP_BINARY (pour les fichiersbinaires).

$offset Position dans le fichier distant du premier octet à transférer. (Paramètreajouté depuis PHP 4.3.0)

retour TRUE si le fichier a pu être récupéré, FALSE sinon.

ftp_fput()Permet de déposer le contenu d’un fichier ouvert (ou plus généralement un stream) sur unserveur FTP.

Syntaxe boolean ftp_fput(resource $idConnexion, string$fichierDistant, resource $idFichier, int $mode [, int$offset])

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$fichierDistant Nom qu’aura le fichier sur le serveur FTP.

$idFichier Identifiant (obtenu par fopen()) du fichier à copier.

$mode FTP_ASCII (pour les fichiers textes) ou FTP_BINARY (pour les fichiersbinaires).

$offset Position dans le fichier local du premier octet à transférer. (Paramètreajouté depuis PHP 4.3.0)

retour TRUE si le fichier a pu être mis sur le serveur FTP, FALSE sinon.

Exemple d’applicationLes fonctions vues jusque-là sont les fonctions les plus couramment utilisées, et nouspermettent de réaliser un script de client FTP.

Dans le script présenté, l’utilisateur pourra naviguer sur le compte FTP, ajouter des fichiers, ensupprimer, en renommer, ajouter et supprimer des répertoires, uploader ou télécharger desfichiers.

FTP

1281

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 20: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Voici le script en question :

Listing 16.2 : ftp.php

<html><head>

<title>Client FTP</title><link rel="stylesheet" type="text/css" href="style.css" />

</head><body>

<center><font color="blue"><h1>Client FTP 12.9</h1></font></center><font color="red">

<?php// On augmente le temps de vie du script à 100 secondesset_time_limit(100);// Parametres de connexion$serveur = "ftp.monsite.com";$utilisateur = "utilisateur";$motdepasse = "motdepasse";// Connexion au serveur FTP$connexion = ftp_connect($serveur)

or die("Serveur FTP inexistant");// Identifiaction sur le serveur FTPftp_login($connexion, $utilisateur, $motdepasse)

or die("Utilisateur inconnu ou mauvais mot de passe");

$repertoire = $_GET["repertoire"]!="" ? $_GET["repertoire"] : "/";

Figure 16.2 :Client FTP en PHP

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1282

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 21: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

// Verifie si "effacer" est passé en parametreif ($_GET["effacer"]!="") {

effacer($_GET["effacer"], $repertoire);}// Verifie si "effacerrep" est passé en parametreif ($_GET["effacerrep"]!="") {

effacerRep($_GET["effacerrep"], $repertoire);}// Verifie si "telecharger" est passé en parametreif ($_GET["telecharger"]!="") {

telecharger($_GET["telecharger"], $repertoire);}// Verifie si "nouveaurep" est passé en parametreif ($_POST["nouveaurep"]!="") {

nouveauRep($_POST["nouveaurep"], $repertoire);}// Verifie si "ajouterfichier" est passé en parametreif ($_POST["ajouterfichier"]!="") {

ajouterFichier($_POST["ajouterfichier"], $repertoire);}// Verifie si "nouveaunom" est passe en parametreif ($_POST["nouveaunom"]!="") {

nouveauNom($_POST["nouveaunom"], $_POST["fichier"], $repertoire);}

?></font><form method="post">

Nouveau Repertoire:<input type="text" name="nouveaurep" /><br /><form><form method="post">

Ajouter fichier:<input type="text" name="ajouterfichier" /><font size="1">Le chemin doit etre absolou ou relatif a

l’endroit ou est place ce script.</font><br /><form>

<?php// Changement de repertoireftp_chdir($connexion, $repertoire);// Affichage du contenu du repertoirelisterRepertoire($repertoire);ftp_close($connexion);

?></body>

</html>

<?phpfunction listerRepertoire($repertoire) {

global $connexion;echo "<h2><font color=\"green\">".$repertoire."</font></h2>\n";// Affichage du lien vers le repertoire superieurif ($repertoire!="/") {

echo "<a href=\"ftp1.php?repertoire=".

FTP

1283

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 22: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

substr(substr($repertoire, 0, -1), 0,1+strrpos(substr($repertoire, 0, -1), "/"))."\">

<h2><font color=\"green\">".substr(substr($repertoire, 0, -1), 0,

1+strrpos(substr($repertoire, 0, -1), "/"))."</font></h2></a>\n";

}// Recuperation de la liste des fichiers$liste = ftp_rawlist($connexion, $repertoire);echo "<table>";foreach($liste as $fichier) {

echo "<tr>";if (substr($fichier,0,1)=="d") {

echo "<td>";echo "<a href=\"ftp1.php?repertoire=$repertoire".

substr($fichier,56)."/\">"."<b>".substr($fichier,56)."/</b></a><br />\n";

echo "</td><td>";echo "<a href=\"ftp1.php?repertoire=$repertoire&effacerrep=".

substr($fichier,56)."\">Effacer ce repertoire</a><br />\n";} else {

echo "<td>";echo "<a href=\"ftp1.php?repertoire=$repertoire&telecharger=".

substr($fichier,56)."\"><b>".substr($fichier,56)."</b>\n";echo "</td><td>";echo "<a href=\"ftp1.php?repertoire=$repertoire&effacer=".

substr($fichier,56)."\">Effacer</a><br />\n";echo "</td>";echo "</tr><tr><td>&nbsp;</td><td>";echo "<form method=\"post\">".

"<input type=\"hidden\" name=\"fichier\"value=\"$repertoire\"".substr($fichier,56)."\"/>

<input type=\"text\" name=\"nouveaunom\" /><input type=\"submit\" value=\"Renommer\"/></form>";

echo "</td>";}

echo "</tr>";}echo "</table>";

}// Efface un fichierfunction effacer($fichier, $repertoire) {

global $connexion;if (@ftp_delete($connexion, $repertoire.$fichier))

echo "Le fichier $fichier a ete supprime";else

echo "Impossible d’effacer le fichier $fichier";}

// Efface un repertoire videfunction effacerRep($fichier, $repertoire) {

global $connexion;

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1284

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 23: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

if (@ftp_rmdir($connexion, $repertoire.$fichier))echo "Le repertoire $fichier a ete supprime";

elseecho "Impossible d’effacer le repertoire $fichier assurez vous "

."qu’il est vide";}

// Telecharge un fichier depuis le site FTPfunction telecharger($fichier, $repertoire) {

global $connexion;if (@ftp_get($connexion, $fichier, $repertoire.$fichier, FTP_BINARY))

echo "Le fichier $fichier devrait etre telecharge dans le repertoire"." ou se trouve ce script";

elseecho "Impossible d’ouvrir le fichier $fichier";

}

// Cree un repertoirefunction nouveauRep($fichier, $repertoire) {

global $connexion;if (@ftp_mkdir($connexion, $repertoire.$fichier))

echo "Le nouveau repertoire $fichier a ete cree";else

echo "Impossible de creer le repertoire $fichier";}

// Renomme un fichierfunction nouveauNom($nouveaunom, $fichier, $repertoire) {

global $connexion;if (@ftp_rename($connexion, $fichier, $repertoire.$nouveaunom))

echo "Le fichier $fichier a ete renomme";else

echo "Impossible de renommer $fichier";}

// Ajoute un fichierfunction ajouterFichier($fichier, $repertoire) {

global $connexion;$nomFichier = (strrchr($fichier, "/")) ?

$repertoire.substr(strrchr($fichier, "/"), 1) :$repertoire.$fichier;

if (@ftp_put($connexion, $nomFichier, $fichier, $FTP_BINARY))echo "Le fichier $fichier a ete ajoute";

elseecho "Impossible d’ajouter $fichier";

}

?>

FTP

1285

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 24: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Transfert de fichiers en mode asynchroneLes fonctions ftp_put(), ftp_get(), ftp_fput() et ftp_fget() sont des fonctionssynchrones. C’est à dire que lorsque le script PHP traite ces fonctions il ne fait plus rien d’autreen attendant le transfert complet des données. Depuis, PHP 4.3.0, ces fonctions ont leuréquivalent en mode asynchrone. Il s’agit des fonctions ftp_nb_put(), ftp_nb_get(),ftp_nb_fput(), ftp_nb_fget(). Leur syntaxe est tout à fait identique si ce n’est qu’elles neretournent pas un booléen mais un entier dont les valeurs possibles sont les mêmes que cellesretournées par la fonction décrite ci-après. Une fois lancées, ces fonctions transfèrent bien lesfichiers mais le script, lui, continue pour traiter les instructions suivantes. Pour savoir si laprécédente opération est terminée vous devrez faire appel à la fonction ftp_nb_continue().

ftp_nb_continueTeste si la dernière opération FTP asynchrone lancée est terminée ou non.

Syntaxe : int ftp_nb_continue(resource $idConnexion)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

retour FTP_MOREDATA si le transfert est en cours, FTP_FINISHED s’il estterminé ou FTP_FAILED s’il a échoué.

Autres fonctions

ftp_exec()Permet d’exécuter une commande sur le serveur FTP si celui-ci l’autorise.

Syntaxe boolean ftp_exec(resource $idConnexion, string $commande)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$commande Commande à exécuter sur le serveur.

retour TRUE en cas de succès, FALSE sinon.

ftp_site()Envoie une commande à un serveur FTP de type SITE xxxx.

Syntaxe boolean ftp_site(resource $IdConnexion, string $commande)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$commande Commande à exécuter.

retour TRUE en cas de succès, FALSE sinon.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1286

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 25: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Paramètres de connexion

ftp_get_option()Retourne certains paramètres de la connexion FTP courante.

Syntaxe mixed ftp_get_option(resource $idConnexion, int $option)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

option Option dont on veut connaître la valeur. Seul le temps avant abandond’une commande est disponible ; la constante estFTP_TIMEOUT_SEC, lafonction retourne alors le temps en secondes.

retour Dépend de l’option.

ftp_set_option()Définit certains paramètres de la connexion FTP courante.

Syntaxe boolean ftp_set_option(resource $idConnexion, int $option,mixed $valeur)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

option Option dont on veut définir la valeur. Seul le temps avant abandon d’unecommande est disponible ; la constante est FTP_TIMEOUT_SEC.

$valeur Valeur du paramètre à définir. Pour FTP_TIMEOUT_SEC, la valeur est àdonner en secondes.

retour TRUE si le paramètre a pu être modifié.

ftp_pasv()Permet de passer en mode passif. Cela peut servir pour passer outre un firewall un peuexigeant.

Syntaxe boolean ftp_pasv(resource $idConnection, boolean $pasv)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$pasv TRUE pour activer le mode passif, FALSE sinon.

retour TRUE si le changement de mode a pu s’effectuer, FALSE sinon.

FTP

1287

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 26: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Information sur les fichiers

ftp_mdtm()Retourne la date de dernière modification d’un fichier.

Syntaxe : int ftp_mdtm(resource $idConnexion, string $fichierDistant)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$fichierDistant Fichier dont on veut connaître la date de dernière modification.

retour La date de dernière modification au format timestamp d’UNIX.

ftp_size()Retourne la taille d’un fichier.

Syntaxe int ftp_size(resource $idConnexion, string $fichierDistant)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

$fichierDistant Fichier dont on veut connaître la taille.

retour Taille du fichier en octets, −1 si le fichier n’existe pas.

Informations sur le serveur

ftp_systype()Retourne le type du système d’exploitation du serveur FTP (UNIX par exemple).

Syntaxe string ftp_systype(resource $idConnexion)

$idConnexion Identifiant de connexion obtenu par ftp_connect().

retour Le nom du système d’exploitation (attention, cela n’est absolument pasprécis. Un serveur sous Linux renverra UNIX, mais cela permet dedifférencier les systèmes de fichiers de type UNIX et Windows.)

16.5. cURL (client URL Library)La bibliothèque cURL a été développée afin de permettre le développement d’applicationsdevant effectuer des opérations sur le réseau. Elle est disponible sur de nombreux systèmes :Linux, Windows, HPUnix, Solaris, Amiga, OS/2, MacOS X et d’autres encore.

cURL supporte différents protocoles parmi lesquels :

j FTP et FTPS ;

j HTTP et HTTPS ;

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1288

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 27: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

j GOPHER ;

j TELNET ;

j LDAP(v2) ;

j Le transfert de fichiers.

Vous pouvez retrouver tous les protocoles supportés par cURL sur cette page :http://curl.haxx.se/docs/features.html.

Elle gère les HTTP POST, HTTP PUT, l’upload de fichiers par FTP ou HTTP et passe lesproxys. De plus, cURL sait manipuler les cookies et effectuer l’authentification HTTP.

Installation

Installation sous LinuxSi vous utilisez Linux, il est probable que vous ayez les librairies cURL installées sur votremachine. Si ce n’est pas le cas, vous pouvez toujours les télécharger sur le site web à l’adressehttp://curl.haxx.se/download.html (ou utiliser la version disponible sur le CD-ROM).

Si vous souhaitez utiliser SSL, vous devrez également l’installer (ce qui est généralement déjàfait par défaut). OpenSSL est disponible à l’adresse http://www.openssl.org/. Nous supposeronsici qu’il a été installé sous /usr/local/ssl.

Si vous avez récupéré les sources de cURL, commencez par décompresser l’archive en tapant :

# tar -zxvf curl-7.10.7.tar.gz# cd curl 7.10.7

Ensuite, compilez cURL de la façon suivante :

# ./configure --disable-ipv6 --with-ssl=/usr/local/ssl# make# make install

Recompilez PHP en ajoutant l’option −−with−curl=/usr/local/lib et puis relancez leserveur web.

VérificationAppelez un simple script contenant <?php phpinfo(); ?>, vous devriez avoir un résultatsimilaire à :

Nous pouvons à présent nous concentrer sur la manipulation de ce module avec le langage PHP.

Figure 16.3 :Vérifions que le moduleest activé

cURL (client URL Library)

1289

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 28: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Utilisation

Initialiser une session cURLAfin d’exploiter les différentes fonctions cURL, vous devez, dans un premier temps, créer unesession avec l’instruction curl_init().

curl_init()Initialise une session cURL.

Syntaxe resource curl_init([string $adresse])

$adresse Adresse utilisée par les différentes fonctions cURL. Ce paramètre estoptionnel, et peut être fixé ou modifié plus tard à l’aide de la fonctioncurl_setopt().

retour Ressource vers la session cURL initialisée.

Fermer une session cURLLa fermeture de la session est réalisée par l’appel à l’instruction curl_close().

curl_close()Ferme une session cURL.

Syntaxe void curl_close(resource $curlId)

$curlId Pointeur sur la ressource tel que retourné par curl_init().

Préparer une requêteAvant d’effectuer votre requête, quelle qu’elle soit, vous devez spécifier certaines options àPHP. Pour cela, vous utiliserez la fonction curl_setopt().

curl_setopt()Permet de spécifier les options nécessaires à votre transfert cURL.

Syntaxe boolean curl_setopt (resource $curlId, string $option, mixed$valeur)

$curlId Pointeur sur la ressource tel que retourné par curl_init().

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1290

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 29: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

$option Option à modifier. Voyez le tableau ci-après pour connaître les différentsparamètres configurables.

$valeur Nouvelle valeur à donner à l’option.

retour TRUE si la modification de l’option a été effectuée avec succès, FALSEdans le cas contraire.

Tableau 16.1 : Les différentes options configurables avec l’instruction curl_setopt()

Option Description

CURLOPT_COOKIEJAR Indique à PHP/cURL le fichier où doivent être stockés lesdifférents cookies.

CURLOPT_COOKIEFILE Indique le fichier contenant les différents cookies et leursvaleurs. Le fichier peut être dans même format que celui d’unen-tête HTTP :Set−Cookie: cookie1=premier+cookieSet−Cookie: cookie2=deuxieme+cookieSet−Cookie: cookie3=troisieme+cookieSet−Cookie: cookie4=quatrieme+cookie

CURLOPT_CUSTOMREQUEST Permet d’indiquer une méthode particulière à envoyer auserveur : PUT, DELETE, etc.

CURLOPT_FAILONERROR Indique à PHP/cURL de retourner les erreurs HTTP 300 et plus.Pour activer cette option, vous devez indiquer TRUE (ouFALSE sinon). Par défaut, cette option est desactivée.

CURLOPT_FILE Spécifie le pointeur du fichier devant contenir les données devotre transfert. Ce fichier doit avoir été ouvert en écriture parl’instruction fopen().

CURLOPT_FOLLOWLOCATION Indique à PHP/cURL de suivre toutes les redirections HTTPenvoyées par le serveur distant. Pour activer cette option vousdevez indiquer TRUE (ou FALSE sinon). Par défaut, l’optionest activée.

CURLOPT_FTPAPPEND Indique à PHP/cURL de ne pas écraser les fichiers distants. Àla place, le contenu du fichier est ajouté à la suite de celuiexistant. Pour activer cette option vous devez indiquer TRUE(ou FALSE sinon).

CURLOPT_FTPLISTONLY Indique à PHP/cURL de n’effectuer qu’un listing des noms desfichiers sur un serveur FTP. Pour activer cette option, vousdevez indiquer TRUE (ou FALSE sinon). Par défaut PHPretourne la liste complète des fichiers.

CURLOPT_FTPPORT Spécifie au serveur distant l’adresse utilisée par PHP/cURLpour la connexion par FTP. Cette adresse est indiquée lorsd’une connexion par FTP par la commande "PORT" envoyée auserveur.

CURLOPT_HEADER Indique à PHP/cURL de retourner l’en-tête dans la réponse.Pour activer cette option, vous devez indiquer TRUE (ouFALSE sinon). Par défaut, PHP renvoie uniquement le corpsdu document.

cURL (client URL Library)

1291

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 30: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Option Description

CURLOPT_INFILE Spécifie le pointeur de fichier contenant les données que vousexpédiez lors d’un transfert. Ce fichier doit avoir été ouvert enlecture par l’instruction fopen().

CURLOPT_INFILESIZE Cette option sert à fixer la taille maximale des données àtransmettre à un serveur distant.

CURLOPT_LOW_SPEED_LIMIT Indique le nombre d’octets par secondes qui doivent circuler defaçon à valider l’action de cURL. Si la vitesse indiquée n’estpas atteinte, PHP annulera l’exécution de l’action. Cette vitesseest calculée pendant une durée fixée parCURLOPT_LOW_SPEED_TIME.

CURLOPT_LOW_SPEED_TIME Indique le temps en secondes qui est considéré pour vérifier letaux de transfert fixé par l’optionCURLOPT_LOW_SPEED_LIMIT.

CURLOPT_MUTE Indique à PHP/cURL de ne pas retourner les messagesretournés par les différentes actions de cURL. Pour activercette option, vous devez indiquer TRUE (ou FALSE sinon).

CURLOPT_NETRC Indique à PHP/cURL d’utiliser le compte utilisateur et le mot depasse de l’utilisateur courant (tel que défini dans le fichier ./netrcsous Linux) pour effectuer la connexion à distance. Pour activercette option, vous devez indiquer TRUE (ou FALSE sinon).

CURLOPT_NOBODY Indique à PHP/cURL de ne pas retourner le corps du document.Pour activer cette option, vous devez indiquer TRUE (ouFALSE sinon). Par défaut, l’option est desactivée.

CURLOPT_NOPROGRESS Indique à PHP/cURL de retourner l’état des transferts avec leserveur distant. Pour activer cette option, vous devez indiquerTRUE (ou FALSE sinon). Par défaut, l’option est desactivée.

CURLOPT_POST Indique à PHP/cURL de préparer une action de type HTTPPOST (identique à l’envoie d’un formulaire HTML par méthodePOST). Pour activer cette option, vous devez indiquer TRUE(ou FALSE sinon).

CURLOPT_POSTFIELDS Indique à PHP/cURL les différentes données à passer lors d’untransfert HTTP par méthode POST. La chaîne doit être passéedans ce format :var1=valeur1&var2=valeur2&var(n)=valeur(n).

CURLOPT_PROXYUSERPWD Nom de l’utilisateur et mot de passe à utiliser lors de laconnexion à un proxy HTTP. La chaîne indiquée est de la formenomUtilisateur:motPasse.

CURLOPT_PUT Indique à PHP/cURL de préparer une action HTTP de type PUT.Pour activer cette option, vous devez indiquer TRUE (ouFALSE sinon).

CURLOPT_RANGE Permet de spécifier la plage de valeurs désirée. Vous devez laspécifier de la façon suivante : val1−val2. Vous pouvezpréciser plusieurs plages différentes en les séparant par unevirgule de la façon suivante : val1−val2, val3−val4.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1292

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 31: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Option Description

CURLOPT_REFERER Permet de spécifier l’en-tête REFERER envoyée lors d’unerequête au serveur distant.

CURLOPT_RESUME_FROM Indique à PHP/cURL le début du transfert. La valeur est fixée enoctets.

CURLOPT_RETURNTRANSFER Option permettant de récupérer le résultat dans une variable àl’exécution de la session : $resultat =curl_exec($curlId). Pour activer cette option, vousdevez indiquer TRUE (ou FALSE sinon). Par défaut, lafonction curl_exec() retourne un booléen.

CURLOPT_SSLCERT Indique le fichier contenant le certificat SSL à passer auserveur. Ce certificat doit être au format PEM.

CURLOPT_SSLCERTPASSWD Indique le mot de passe utilisé avec le certificat spécifié parl’option CURLOPT_SSLCERT.

CURLOPT_SSLVERSION Indique la version de SSL utilisée pour les opérations aveccURL. La valeur peut être de 2 ou 3. Par défaut, PHP ladéterminera automatiquement.

CURLOPT_STDERR Spécifie le pointeur du fichier devant contenir les erreurspouvant survenir lors d’un transfert. Ce fichier doit avoir étéouvert en écriture par l’instruction fopen().

CURLOPT_TIMECONDITION Indique à PHP/cURL comment utiliser l’optionCURLOPT_TIMEVALUE. Les valeurs possibles sontTIMECOND_IFMODSINCE ouTIMECOND_ISUNMODSINCE. Par défaut, l’option est àTIMECOND_IFMODSINCE.

CURLOPT_TIMEOUT Indique, en secondes, le temps maximum accordé à l’exécutiond’une action par cURL.

CURLOPT_TIMEVALUE Temps en secondes depuis le 1er janvier 1970.

CURLOPT_UPLOAD Indique à PHP/cURL de préparer un transfert de fichier. Pouractiver cette option, vous devez indiquer TRUE (ou FALSEsinon).

CURLOPT_URL URL indiquant à PHP/cURL la page et le serveur distant. CetteURL désigne la page qui doit être récupérée. Cette option peutêtre fixée dès l’appel à l’instruction curl_init().

CURLOPT_USERAGENT Permet de spécifier l’en-tête USER-AGENT envoyé lors d’unerequête au serveur distant.

CURLOPT_USERPWD Nom de l’utilisateur et mot de passe de l’utilisateur qui doiventêtre utilisés lors de la connexion distante. La chaîne indiquéeest de la forme nomUtilisateur:motPasse.

CURLOPT_VERBOSE Indique à PHP/cURL d’afficher tous les événements. Pouractiver cette option, vous devez indiquer TRUE (ou FALSEsinon).

cURL (client URL Library)

1293

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 32: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Option Description

CURLOPT_WRITEHEADER Spécifie le pointeur du fichier devant contenir l’en-tête de sortiede votre transfert. Ce fichier doit avoir été ouvert en écriture parl’instruction fopen().

De nombreux paramètres ont un lien étroit avec les en-têtes HTTP ; n’hésitez pas àconsulter l’annexe "Les en-têtes" pour plus d’informations.

Récupérer les informations d’une optionIl est possible de récupérer les valeurs que contient une option en utilisant la fonctioncurl_getinfo().

curl_getinfo()Retourne la valeur d’une option.

Syntaxe string curl_getinfo(resource $curlId, int $option)

$curlId Pointeur sur la ressource tel que retourné par curl_init().

$option Option à récupérer.

retour Chaîne de caractères indiquant la valeur de l’option qui y est associée.

Exécuter une sessionAfin d’exécuter la session, il faut appeler la fonction curl_exec().

curl_exec()Exécute une session cURL.

Syntaxe mixed curl_exec(resource $curlId)

$curlId Pointeur sur la ressource tel que retourné par curl_init().

retour Par défaut, l’exécution de la fonction retourne TRUE si l’exécution de lasession a été réalisée avec succès, FALSE dans le cas contraire. Suivantl’activation de certaines options, l’instruction peut retourner un entier ouune chaîne de caractères. Ainsi, l’option CURLOPT_RETURNTRANSFERindique à PHP de retourner le résultat plutôt que de l’afficher sur la sortiestandard.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1294

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 33: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Gestion des erreursLa gestion des erreurs est réalisée par l’appel à deux instructions : curl_errno() etcurl_error().

La fonction curl_errno() retourne le numéro du code de l’erreur.

curl_errno()Permet de récupérer le code de la dernière erreur rencontrée pour une session cURL.

Syntaxe int curl_errno(resource $curlId)

$curlId Pointeur sur la ressource tel que retourné par curl_init().

retour Code de l’erreur cURL.

La fonction curl_error() permet de récupérer l’erreur dans une chaîne de caractères.

curl_error()Retourne le dernier message d’erreur rencontré dans une session cURL.

Syntaxe string curl_error(resource $curlId)

$curlId Pointeur sur la ressource tel que retourné par curl_init().

retour Message d’erreur cURL.

Vérifier la version de cURLL’instruction curl_version() permet de récupérer la version de votre librairie cURL.

curl_version()Retourne la version de la bibliothèque cURL.

Syntaxe string curl_version(void)retour Chaîne de caractères indiquant la version de la bibliothèque installée sur le

système.

Exemples d’applicationsÀ présent, nous allons voir différents exemples d’utilisation des fonctions cURL. Ce sont desexemples simples, qui n’ont d’autre but que de vous montrer les diverses possibilités de cemodule.

cURL (client URL Library)

1295

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 34: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Afficher le contenu d’une page web distanteVoici l’utilisation la plus simple des fonctions cURL. Le script va chercher la page sur unserveur distant et l’affiche sur le navigateur web.

Listing 16.3 : exemple1.php

<?php$curlId = curl_init("http://www.linux.org/");curl_exec($curlId);curl_close($curlId);?>

Récupérer le contenu d’une page dans un fichierCet exemple est une variation du précédent. Cette fois, nous spécifions simplement un fichierde sortie, ce qui permet de récupérer le code HTML de la page plutôt que de l’afficherdirectement.

Listing 16.4 : exemple2.php

<?php// Ouverture d’un fichier en écriture$fp = fopen("linux.html", "w");

// Création de la session cURL$curlId = curl_init("http://www.linux.org/");

// Fichier de sortiecurl_setopt($curlId, CURLOPT_FILE, $fp);

// Exécution de la sessioncurl_exec($curlId);

// Fermeture de la sessioncurl_close($curlId);

// Fermeture du fichierfclose($fp);

// On vérifie en affichant ensuite le fichierreadfile("linux.html");?>

Envoyer des données par méthode POSTL’exemple suivant montre comment cURL peut envoyer des données par une méthode POST,cet envoi étant alors identique à celui depuis un formulaire HTML.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1296

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 35: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Listing 16.5 : exemple3.php

<?php// Création de la session cURL$curlId = curl_init("http://www.monserveur.com/formulaire.php");

// Le serveur demande une authentificationcurl_setopt($curlId, CURLOPT_USERPWD, "utilisateur:mot2passe");

// Méthode POSTcurl_setopt($curlId, CURLOPT_POST, TRUE);$post = "nom=GUEDON".

"&prenom=Laurent"."&[email protected]"."&action=valider";

curl_setopt($curlId, CURLOPT_POSTFIELDS, $post);

// Indiquons également différents cookies$cookies = "cookie1=premier cookie;cookie2=deuxieme cookie";curl_setopt($curlId, CURLOPT_COOKIE, $cookies);

// Execution de la sessioncurl_exec($curlId);

// Fermeture de la sessioncurl_close($curlId);?>

Lister le contenu d’un répertoire FTPCet exemple liste les noms des fichiers se trouvant dans un répertoire. Le script récupère lesdifférents fichiers dans une variable et les affiche ensuite en ajoutant la balise <br> entre lesdifférents sauts de lignes.

Listing 16.6 : exemple4.php

<?php// Création de la session cURL$curlId = curl_init("ftp://www.monsite.org/repertoire/");

// Indiquons le login et le mot de passe de la connexioncurl_setopt($curlId, CURLOPT_USERPWD, "utilisateur:mot2passe");

// Indiquons de retourner la sortie dans une variablecurl_setopt($curlId, CURLOPT_RETURNTRANSFER, TRUE);

// On demande d’afficher uniquement les noms des fichierscurl_setopt($curlId, CURLOPT_FTPLISTONLY, TRUE);

// Execution de la session$retour = curl_exec($curlId);

cURL (client URL Library)

1297

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 36: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

// Affichons le résultatecho nl2br($retour);

// Fermeture de la sessioncurl_close($curlId);?>

Envoyer un fichier sur un serveur FTPCet exemple montre de façon simple comment envoyer un fichier sur un serveur FTP.

Listing 16.7 : exemple5.php

<?php// Ouverture d’un fichier en lecture$fp = fopen("monfichier.html", "r");

// Création de la session cURL$curlId = curl_init("ftp://ftp.monserveur.com/html/monfichier.html");

// Indiquons le login et le mot de passe de la connexioncurl_setopt($curlId, CURLOPT_USERPWD, "utilisateur:mot2passe");

// Préparation d’un Upload de fichiercurl_setopt($curlId, CURLOPT_UPLOAD, TRUE);

// Taille du fichier à envoyercurl_setopt($curlId, CURLOPT_INFILESIZE, filesize("monfichier.html"));

// Fichier à envoyercurl_setopt($curlId, CURLOPT_INFILE, $fp);

// Indiquons l’adresse "PORT" du clientcurl_setopt($curlId, CURLOPT_FTPPORT, "-");

// Execution de la sessionif (!$donnee = curl_exec($curlId)){

die("Problème lors de l’envoie du fichier\n".curl_error($curlId));

} else {echo "Le fichier a été envoyé sur le serveur.";

}

// Execution de la sessioncurl_exec($curlId);

// Fermeture de la sessioncurl_close($curlId);

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1298

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 37: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

// Fermeture du fichierfclose($fp);?>

16.6. SOAPSOAP (Simple Object Access Protocol) permet d’envoyer des messages XML à des serveurs,en utilisant HTTP comme moyen de communication.

Depuis peu, le célèbre moteur de recherche Google permet gratuitement de faire une requêtesous forme XML via SOAP, et de récupérer le résultat de la requête. Ce sera le sujet de notreexemple.

Un message SOAP est généralement constitué d’un en-tête et d’un corps.

L’exemple que nous décrivons un peu plus loin dans ce chapitre donne lieu à la création dumessage SOAP suivant, que l’on appelle une enveloppe :

<?xml version="1.0" encoding="UTF-8"?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"xmlns:ns4="urn:GoogleSearch"SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

<SOAP-ENV:Body>

<ns4:doGoogleSearch><item xsi:type="xsd:string">M4liC3nceS3cr3tE</item><item xsi:type="xsd:string">mail site:www.toutestfacile.com</item><item xsi:type="xsd:int">0</item><item xsi:type="xsd:int">5</item><item xsi:type="xsd:boolean">true</item><item xsi:type="xsd:string"></item><item xsi:type="xsd:boolean">true</item><item xsi:type="xsd:string">lang_fr|lang_en</item><item xsi:type="xsd:string">latin1</item><item xsi:type="xsd:string">latin1</item></ns4:doGoogleSearch></SOAP-ENV:Body></SOAP-ENV:Envelope>

Dans l’exemple précédent, nous retrouvons, dans le corps de l’enveloppe, les informationspertinentes pour la fonction doGoogleSearch du serveur SOAP de Google.

Les fichiers WSDL (Web Service Definition Language) permettent de définir un service web ;ils sont écrits au format XML. À partir de ces fichiers, il est possible de savoir ce qu’attendentles services web comme paramètres. Voici, par exemple, un extrait du fichier WSL décrivant leservice doGoogleSearch proposé par Google :

<?xml version="1.0"?>

SOAP

1299

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 38: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

<!-- WSDL description of the Google Web APIs.The Google Web APIs are in beta release. All interfaces are subject tochange as we refine and extend our APIs. Please see the terms of usefor more information. -->

<definitions name="urn:GoogleSearch"targetNamespace="urn:GoogleSearch"xmlns:typens="urn:GoogleSearch"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"xmlns="http://schemas.xmlsoap.org/wsdl/">

<!-- Types for search - result elements, directory categories -->

<types><xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"

targetNamespace="urn:GoogleSearch">

<xsd:complexType name="GoogleSearchResult"><xsd:all>

<xsd:element name="documentFiltering"type="xsd:boolean"/>

<xsd:element name="searchComments"type="xsd:string"/>

<xsd:element name="estimatedTotalResultsCount"type="xsd:int"/>

<xsd:element name="estimateIsExact"type="xsd:boolean"/>

<xsd:element name="resultElements"type="typens:ResultElementArray"/>

<xsd:element name="searchQuery"type="xsd:string"/>

<xsd:element name="startIndex"type="xsd:int"/>

<xsd:element name="endIndex"type="xsd:int"/>

<xsd:element name="searchTips"type="xsd:string"/>

<xsd:element name="directoryCategories"type="typens:DirectoryCategoryArray"/>

<xsd:element name="searchTime"type="xsd:double"/>

</xsd:all></xsd:complexType>

<xsd:complexType name="ResultElement"><xsd:all>

<xsd:element name="summary" type="xsd:string"/><xsd:element name="URL" type="xsd:string"/><xsd:element name="snippet" type="xsd:string"/>

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1300

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 39: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

<xsd:element name="title" type="xsd:string"/><xsd:element name="cachedSize" type="xsd:string"/><xsd:element name="relatedInformationPresent" type="xsd:boolean"/><xsd:element name="hostName" type="xsd:string"/><xsd:element name="directoryCategory"

type="typens:DirectoryCategory"/><xsd:element name="directoryTitle" type="xsd:string"/>

</xsd:all></xsd:complexType>

<xsd:complexType name="ResultElementArray"><xsd:complexContent>

<xsd:restriction base="soapenc:Array"><xsd:attribute ref="soapenc:arrayType"

wsdl:arrayType="typens:ResultElement[]"/></xsd:restriction>

</xsd:complexContent></xsd:complexType>

<xsd:complexType name="DirectoryCategoryArray"><xsd:complexContent>

<xsd:restriction base="soapenc:Array"><xsd:attribute ref="soapenc:arrayType"

wsdl:arrayType="typens:DirectoryCategory[]"/></xsd:restriction>

</xsd:complexContent></xsd:complexType>

<xsd:complexType name="DirectoryCategory"><xsd:all>

<xsd:element name="fullViewableName" type="xsd:string"/><xsd:element name="specialEncoding" type="xsd:string"/>

</xsd:all></xsd:complexType>

</xsd:schema></types>

<!-- Messages for Google Web APIs - cached page, search, spelling. -->

<message name="doGoogleSearch"><part name="key" type="xsd:string"/><part name="q" type="xsd:string"/><part name="start" type="xsd:int"/><part name="maxResults" type="xsd:int"/><part name="filter" type="xsd:boolean"/><part name="restrict" type="xsd:string"/><part name="safeSearch" type="xsd:boolean"/><part name="lr" type="xsd:string"/><part name="ie" type="xsd:string"/><part name="oe" type="xsd:string"/>

SOAP

1301

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 40: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

</message>

<message name="doGoogleSearchResponse"><part name="return" type="typens:GoogleSearchResult"/>

</message>

<!-- Port for Google Web APIs, "GoogleSearch" --><portType name="GoogleSearchPort">

<operation name="doGoogleSearch"><input message="typens:doGoogleSearch"/><output message="typens:doGoogleSearchResponse"/>

</operation></portType>

<!-- Binding for Google Web APIs - RPC, SOAP over HTTP -->

<binding name="GoogleSearchBinding" type="typens:GoogleSearchPort"><soap:binding style="rpc"

transport="http://schemas.xmlsoap.org/soap/http"/><operation name="doGoogleSearch">

<soap:operation soapAction="urn:GoogleSearchAction"/><input>

<soap:body use="encoded"namespace="urn:GoogleSearch"encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</input><output>

<soap:body use="encoded"namespace="urn:GoogleSearch"encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

</output></operation>

</binding>

<!-- Endpoint for Google Web APIs --><service name="GoogleSearchService">

<port name="GoogleSearchPort" binding="typens:GoogleSearchBinding"><soap:address location="http://api.google.com/search/beta2"/>

</port></service>

</definitions>

Ce fichier, tel qu’il est écrit, se lit de bas en haut. Tout en bas, nous trouvons l’adresse du serviceweb : http://api.google.com/search/beta2 puis, au dessus, dans la balise <binding>,nous trouvons les différents services (ici, il n’y a que doGoogleSearch) où l’entrée et la sortiesont définies.

Dans la déclaration de la balise <binding>, le lien est fait vers le type GoogleSearchPort. Onretrouve un peu plus haut ce type, qui définit les types d’entrées et de sorties. Les entrées serontdonc de type doGoogleSearch et les sorties de type doGoogleSearchResponse.

Les types doGoogleSearch et doGoogleSearchResponse sont décrits plus haut dans le fichier.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1302

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 41: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

InstallationSOAP fait partie du projet PEAR. Il dépend des paquetages PEAR suivants: Mail_Mime,Net_URL, Net_Socket, HTTP_Request, Net_DIME. Pour les installer vous pouvez, au choix,télécharger le fichier correspondant à l’adresse http://pear.php.net/packages.html et le dézipperdans un espace quelconque défini dans la variable include_path du fichier php.ini, ou bien vouspouvez utiliser les commandes PEAR. Notez toutefois, que pour les paquetages SOAP etNet_DIME qui n’ont pas encore le statut "stable" vous serez obligé de les télécharger avant deles installer avec les commandes Pear.

# pear upgrade Mail_Mime# pear upgrade Net_URL# pear upgrade Net_Socket# pear upgrade HTTP_Request# pear install Net_DIME.tar.gz# pear install SOAP.tar.gz

PHP 5SOAP PEAR n’est (à l’heure de l’écriture de ces lignes) pas compatible avec PHP 5(ceci à cause d’une mauvaise redéfinition de la méthode __call dans la classeSOAP_Client). Si vous vous sentez d’attaque vous pouvez tenter de le fairefonctionner sous PHP 5 en remplaçant la déclaration de la méthode __call par:

function __call($method, $args)

et en remplaçant return TRUE; par

return $this−>call($method, $args);

Il n’est toutefois pas assuré que cela suffise pour un fonctionnement parfait.

Utiliser les classes PEARPEAR produit des classes pour les clients et serveurs SOAP, ainsi que des classes pour fairel’analyse lexicale d’un message SOAP, ou encore une classe qui permet de replacer le protocolestandard HTTP (par la possibilité d’analyser le contenu d’un e-mail et de faire les appelscontenus à l’intérieur de celui-ci).

Mais revenons à la classe a priori la plus utile : la classe SOAP_Client qui permet de faire appelà un serveur SOAP.

Le constructeur de cette classe nécessitera l’adresse du serveur SOAP.

SOAP_Client()Constructeur d’objets SOAP_Client.

Syntaxe SOAP_client SOAP_client(String $url [, boolean $wsdl [, string$nomPort]])

SOAP

1303

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 42: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

$url URL du serveur SOAP.

$wsdl TRUE si l’URL est celle d’un fichier WSDL.

$nomPort Nom du port SOAP utilisé par le client.

retour Un objet de type SOAP_Client.

SOAP_Client->setEncoding()Définit l’encodage des messages.

Syntaxe mixed setEncoding(string $encodage)

$encodage ’UTF−8’, ’US_ASCII’ ou ’ISO−8859−1’.

retour NULL, ou une erreur de type SOAP_Fault.

SOAP_Client->addHeader()Pour ajouter des en-têtes à l’enveloppe SOAP.

Syntaxe void addHeader(SOAP_Header $entete)

$entete En-tête à ajouter de type SOAP_Header.

SOAP_Client->call()Permet de faire un appel au serveur SOAP.

Syntaxe array call(string $methode, array $parametres [, string$espaceNom, [string $actionSoap]])

$methode Nom de la méthode à appeler.

$parametres Tableau des paramètres à passer.

retour Tableau des résultats.

Interroger Google via PHPDepuis début 2002, Google met à disposition un serveur SOAP permettant de faire desrecherches dynamiquement. Attention, l’API fournie permettant d’interroger le moteur derecherche est susceptible d’être modifiée. Pire, ce service pourrait être supprimé du jour aulendemain.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1304

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 43: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Pré-requisPour pouvoir utiliser le serveur SOAP de Google, vous devrez récupérer un numéro de licencesur le site web de Google en créant un nouveau compte. Ce numéro de licence vous permettrade faire jusqu’à 1 000 requêtes par jour.

Nouveau comptePour créer un compte sur Google, l’adresse est :https://www.google.com/accounts/NewAccount?continue=http://api.google.com/createkey &followup=http://api.google.com/createkey.

Vous serez également intéressé par le téléchargement de l’API, car c’est elle qui vous diracomment effectuer vos requêtes.

Télécharger l’APIPour télécharger l’API de Google, l’adresse est :http://www.google.com/apis/download.html.

Notre premier script sera très simple : il permet de faire une recherche avec des mots-clésintégrés dans le script. Les résultats seront affichés sans mise en page, mais juste à l’aide de lafonction print_r().

Listing 16.8 : soapgoogle.php

<?php// On utilisera les classes de projet PEARrequire_once "SOAP/Client.php";// On place ici le numero de licence obtenu sur le site de Google$numeroLicence = "MA_LICENCE, CETTE_CHAINE_DOIT_ETRE_REMPLACEE";// Les mots cles sont stockes dans le script ici.$motsCles = "Apprendre PHP facilement";// Creation du client SOAP et declaration du serveur SOAP.$soapClient = new SOAP_Client("http://api.google.com/search/beta2");// Les parametres a passer tels que decrits dans l’API de Google// (licence,// motscles,// indice du premier resultat a retourner,// nombre de resultats a retourner,// utilisation ou non du filtre cachant les resultats similaires,// restrictions a un pays ou domaine...,// filtrage des sites pour adultes,// Restriction sur la langue,// encodage d’entree,// encodage de sortie)

$recherche = array($numeroLicence, $motsCles, 0, 1, TRUE, "",TRUE, "", "", "");

// Appel a la methode "doGoogleSearch" du serveur SOAP,

SOAP

1305

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 44: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

$result = $soapClient->call("doGoogleSearch", $recherche,"urn:GoogleSearch");

// Affichage du resultatprint_r($result);

?>

Le résultat obtenu est le suivant :

stdClass Object(

[documentFiltering] => 1[estimatedTotalResultsCount] => 7080[directoryCategories] =>[searchTime] => 0.133035[resultElements] => Array

([item] => stdClass Object

([cachedSize] => 22k[hostName] =>[snippet] => Un site pour bien apprendre le PHP et SQL , les✂ scripts commentés, le forum et les tutoriaux sont là pour✂ vous aider.[directoryCategory] => stdClass Object

([specialEncoding] =>[fullViewableName] => Top/World/Français/✂ Informatique/Programmation/Langages/PHP

)

[relatedInformationPresent] => 1[directoryTitle] => <b>PHP</b> <b>Facile</b>[summary] => <b>Apprendre</b> le <b>PHP</b>. On y trouve des✂ tutoriaux, des scripts commentés et un forum.[URL] => http://www.phpfacile.com/[title] => <b>PHP</b> <b>Facile</b> ! Le site pour✂ <b>apprendre</b> le <b>PHP</b> simplement et <b>...</b>

)

)

[endIndex] => 1[searchTips] =>[searchComments] =>[startIndex] => 1[estimateIsExact] =>[searchQuery] => Apprendre PHP facile

)

Ce n’est pas plus difficile que ces quelques lignes…

À partir de là, il est facile d’élaborer un moteur de recherche personnel basé sur Google.

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1306

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.

Page 45: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

Voici notre interface graphique : elle permet d’entrer les mots-clés comme sur le site de Google,de préciser le nombre de résultats maximum à retourner, et le site sur lequel restreindre lerecherche (il suffira de laisser le champ vide pour faire une recherche sur tous les sites).

Le script chargé de traiter la requête est le suivant :

Listing 16.9 : mp_perso.php

<html><head>

<title>Moteur de recherche personnel</title><link rel="stylesheet" type="text/css" href="style.css" />

</head><body>

<center><font color="blue"><h1>Resultat de la recherche</h1>

</font></center><?php

// On utilisera les classes de projet PEARrequire_once "SOAP/Client.php";// On place ici le numero de licence obtenu sur le site de Google$numeroLicence = " MA_LICENCE, CETTE_CHAINE_DOIT_ETRE_REMPLACEE ";// Les mots cles sont stockes dans le script ici.$motsCles = $_POST["motscles"]." site:".$_POST["site"];$nbresultats = $_POST["nbresultats"];// Creation du client SOAP et declaration du serveur SOAP.$soapClient = new SOAP_Client("http://api.google.com/search/beta2");// Les parametres a passer tels que decrits dans l’API de Google// (licence,// motscles,// indice du premier resultat à retourner,// nombre de resultats à retourner,// utilisation ou non du filtre cachant les resultats similaires,// restrictions à un pays ou domaine...,// filtrage des sites pour adultes,// Restriction sur la langue,// encodage d’entrée,// encodage de sortie)

$recherche = array($numeroLicence, $motsCles, 0,

Figure 16.4 :Le formulaire remplipour notre exemple

SOAP

1307

16.Lagestion

desprotocoles

HTTP,FTP,SOAP,etc.

Page 46: Lagestiondes protocolesHTTP, FTP,SOAP,etc.

(int)$nbresultats, TRUE, "", TRUE,"lang_fr|lang_en", "latin1", "latin1");

// Appel a la methode "doGoogleSearch" du serveur SOAP,$result = $soapClient->call("doGoogleSearch", $recherche,

"urn:GoogleSearch");// Affichage du resultatecho "<font size=\"2\">";echo "<br />Temps de recherche:".$result->searchTime;echo "<br />Estimation du nombre de resultats:".

$result->estimatedTotalResultsCount."<br />";echo "</font>";$i = 0;if ($result->resultElements) {

foreach ($result->resultElements as $resultat) {$i++;echo "<br />$i - <a href=\"".$resultat->URL."\">".

$resultat->title."</a><br />";echo $resultat->snippet."<br />";echo "<font size=\"1\" color=\"#666666\">".

$resultat->title."</font><br />";echo "<br />";

}} else {

echo "Pas de resultat";}

?></body>

</html>

qui aura pour effet l’affichage suivant :

Figure 16.5 : Résultat de la recherche

Chapitre 16 La gestion des protocoles HTTP, FTP, SOAP, etc.

1308

16.Lagestiondes

protocolesHTTP,FTP,

SOAP,etc.