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



Documents pareils
L3 informatique TP n o 2 : Les applications réseau

Serveurs de noms Protocoles HTTP et FTP

Gilles.Roussel univ-mlv.fr HTTP/1.1 RFC 2068

L envoi d un formulaire par courriel. Configuration requise Mail Texte Mail HTML Check-list

Réseaux. 1 Généralités. E. Jeandel

Keyyo Guide de mise en service CTI / API / TAPI Keyyo

INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)

(structure des entêtes)

Protection des protocoles

HTTP HTTP. IUT1 dpt SRC L Isle d Abeau Jean-françois Berdjugin. Introduction et architecture Messages Authentification Conclusion

HTTP 1.1. HyperText Transfer Protocol TCP IP ...

Installation d un serveur HTTP (Hypertext Transfer Protocol) sous Débian 6

Manuel d intégration API SOAP SMS ALLMYSMS.COM

Plateforme PAYZEN. Définition de Web-services

SUGARCRM Sugar Open Source Guide d Installation de French SugarCRM Open Source Version 4.2

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Stockage du fichier dans une table mysql:

Les solutions de paiement CyberMUT (Crédit Mutuel) et CIC. Qui contacter pour commencer la mise en place d une configuration de test?

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Dans l'épisode précédent

Le service FTP. M.BOUABID, Page 1 sur 5

Étude de l application DNS (Domain Name System)

SQUID P r o x y L i b r e p o u r U n i x e t L i n u x

Installation / Sauvegarde Restauration / Mise à jour

TP JAVASCRIPT OMI4 TP5 SRC

Plateforme PAYZEN. Intégration du module de paiement pour la plateforme Magento version 1.3.x.x. Paiement en plusieurs fois. Version 1.

Cours CCNA 1. Exercices

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Services Réseaux - Couche Application. TODARO Cédric

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

Application Web et J2EE

Gestion centralisée d un réseau de sites discrets. Nicolas JEAN

Bind, le serveur de noms sous Linux

Le langage C. Séance n 4

Couche application. La couche application est la plus élevée du modèle de référence.

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Préparation d un serveur Apache pour Zend Framework

Programmation système I Les entrées/sorties

Module http MMS AllMySMS.com Manuel d intégration

Tutoriel Création d une source Cydia et compilation des packages sous Linux

0.1 Mail & News : Thunderbird

Quelques protocoles et outils réseaux

Protocoles Applicatifs

COMPRENDRE L ARCHITECTURE DES WEB SERVICES REST. Amosse EDOUARD, Doctorant

Introduction à HTTP. Chapitre HTTP 0.9

Formulaire pour envoyer un mail

RFC 7230 : Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing

Cours Master Recherche RI 7 Extraction et Intégration d'information du Web «Services Web»

Configuration du nouveau Bureau Virtuel (BV) collaboratif de Lyon I

Mise en place d un serveur Proxy sous Ubuntu / Debian

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Les services usuels de l Internet

Activité sur Meteor. Annexe 1 : notion de client-serveur et notion de base de données

Bon ben voilà c est fait!

Créer et partager des fichiers

DNS : Domaine Name System

Supervision de réseau

Guide administrateur AMSP

Programmation Web. Madalina Croitoru IUT Montpellier

INF8007 Langages de script

A.P.I. Kuka Manuel de l utilisateur Version 0.0.5

Master d'informatique 1ère année Réseaux et protocoles

TP n 2 : Installation et administration du serveur ProFTP. Partie 1 : Fonctionnement du protocole FTP (pas plus de 15min)

Guide d installation de SugarCRM Open Source version 4.5.1

Linux LTE 2 - ISSBA. Année universitaire Linux Réseau et Archivage. Jean-Michel RICHER Faculté des Sciences, H206 1

Attaques applicatives

DOMAIN NAME SYSTEM. CAILLET Mélanie. Tutoriel sur le DNS. Session Option SISR

Internets. Informatique de l Internet: le(s) Internet(s) Composantes de l internet R3LR RENATER

Serveur FTP. 20 décembre. Windows Server 2008R2

Introduction aux «Services Web»

TP LINUX : MISE EN PLACE DU SERVEUR DE MESSAGERIE QMAIL

GUIDE D INSTALLATION DE L APPLICATION GECOL SUR

MANUEL D INSTALLATION D UN PROXY

18 TCP Les protocoles de domaines d applications

TP1. Outils Java Eléments de correction

Introduction à Linux (pour le HPC) «Linux 101» Présentation :

Failles XSS : Principes, Catégories Démonstrations, Contre mesures

CREATION WEB DYNAMIQUE

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

Manuel d'installation

Squid. Olivier Aubert 1/19

Cours Linux. Cours en ligne Administrateur Systèmes Linux. Académie Libre

TP réseaux 4 : Installation et configuration d'un serveur Web Apache

C.M. 1 & 2 : Prise en main de Linux

Introduction. PHP = Personal Home Pages ou PHP Hypertext Preprocessor. Langage de script interprété (non compilé)

Développement Web. Les protocoles

Les différentes méthodes pour se connecter

PHP CLÉS EN MAIN. 76 scripts efficaces pour enrichir vos sites web. par William Steinmetz et Brian Ward

Service FTP. Stéphane Gill. Introduction 2

KAJOUT WASSIM INTERNET INFORMATION SERVICES (IIS) 01/03/2013. Compte-rendu sur ISS KAJOUT Wassim

Dans l'article précédent, vous avez appris

PPE Installation d un serveur FTP

Installation ou mise à jour du logiciel système Fiery

DNS ( DOMAIN NAME SYSTEM)

Configuration d un firewall pour sécuriser un serveur WEB

Le serveur HTTPd WASD. Jean-François Piéronne

Logiciel : GLPI Version : SYNCRHONISATION DE GLPI AVEC ACTIVE DIRECTORY. Auteur : Claude SANTERO Config. : Windows 2003.

Chapitre 1 Windows Server

TP4 : Firewall IPTABLES

Transcription:

Chapitre 16 La gestion des protocoles HTTP, FTP, 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

Réseau 16.1. Fonctions réseau (de base) 16.2. Réseau Les fonctions présentées dans ce chapitre ne permettent pas de réels développements, mais constituent 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écessitent aucune installation particulière. Adresses IP et DNS L opération la plus souvent sollicitée est certainement celle qui consiste à déterminer l adresse IP d une machine lorsque l on ne connaît que son nom. Pour cela, vous disposez de la fonction gethostbyname(). gethostbyname() Retourne l adresse IP de la machine précisée par son nom. $nommachine string gethostbyname(string $nommachine) Nom de la machine. Adresse IP de la machine, ou $nommachine si aucune adresse IP n a pu être trouvée. Ainsi, le code suivant : <?php echo gethostbyname("localhost");?> nera très probablement : 127.0.0.1 Alors que : <?php echo gethostbyname("www.php.net");?> nera une adresse IP publique comme, par exemple, 208.210.50.161 1265

Chapitre 16 La gestion des 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). $adresseip string gethostbyaddr(string $adresseip) Adresse IP de la machine. Nom associé à la machine, ou $adresseip si aucun nom n a pu être trouvé. Le code suivant : <?php echo gethostbyaddr("127.0.0.1");?> pourra ner : localdomain.localhost On notera au passage que l opération n est pas nécessairement réversible. Si gethostbyname("localhost") ne "127.0.0.1" cela n implique pas que gethostbyaddr("127.0.0.1") ne "localhost". En effet, une machine peut avoir plusieurs noms (via des alias), et c est donc le nom principal qui est né par gethostbyaddr(). 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. $nommachine array gethostbynamel($nommachine) Nom de la machine. Tableau indexé des adresses IP de la machine, ou FALSE si aucune adresse IP 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. 1266

Réseau ip2long() Convertit une adresse IP du format "xxx.xxx.xxx.xxx" en un entier. : int ip2long(string $adresseip) $adresseip Adresse IP au format "xxx.xxx.xxx.xxx". Adresse IP sous forme d un entier. Entier signé ou non Un simple echo du résultat fourni par ip2long peut conduire à l affichage d un entier né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". int ip2long(string $adresseip) $adresseip Adresse IP sous forme d un entier. Adresse IP au format "xxx.xxx.xxx.xxx". Dans certaines circonstances, comme par exemple pour déterminer si une adresse e-mail a des chances 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. DNS DNS sont les initiales anglaises de "Domain Name Server", autrement dit "Serveur de nom de domaine". En deux mots, ce serveur contient les tables de correspondances qui 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 la version 5 de PHP, cette fonction est baptisée DNS_check_record() (tout en assurant la compatibilité). 1267

Chapitre 16 La gestion des 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 la ré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. TRUE si la machine est connue du DNS (pour le type précisé), FALSE sinon. 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. <?php function testemail($email) { $domaine = strstr($email, @ ); return checkdnsrr($domaine, MX ); } $email = "damien@toutestfacile.com"; 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 en savoir 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. Notez que dans la version 5 de PHP, cette fonction est baptisée DNS_get_mx() (tout en assurant la compatibilité). $nommachine $machines boolean getmxrr(string $nommachine, array &$machines [, array &$poids]) Nom de la machine. Référence sur une variable dans laquelle sera copié un tableau indexé contenant les noms des machines devant "router" les mails. 1268

Réseau $poids Référence sur une variable dans laquelle sera copié un tableau indexé contenant les poids associés aux machines. Les mails seront prioritairement "routés" par la machine de plus faible poids. TRUE si la machine est connue du DNS, FALSE sinon. Protocoles et services PHP propose également des fonctions permettant de récupérer des informations plus intimement liées au serveur. Il est, par exemple, possible de connaître le port associé à un service ou, inversement, de retrouver le nom d un service à partir de son numéro de port. getservbyname() Retourne le port associé au service donné. int getservbyname(string $service, string $protocole) $service Nom du service (ex. : "ftp", "http",...) $protocole Nom du protocole ("tcp" ou "udp"). Numéro de port, ou FALSE en cas d échec. getservbyport() Retourne le nom du service associé au port donné. int getservbyport(string $port, string $protocole) $port Numéro du port. $protocole Nom du protocole ("tcp" ou "udp"). 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 : <?php echo getservbyname("ftp", "tcp")."<br />"; echo getservbyport(80, "tcp");?> ce qui nera (probablement) : 21 http 1269

Chapitre 16 La gestion des Il est également possible de connaître le numéro associé à un protocole ou, inversement, de retrouver 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). $nomprotocole int getprotobyname(string $nomprotocole) Nom du protocole. 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). $numeroprotocole int getprotobynumber(string $numeroprotocole) Numéro du protocole. Nom du protocole, ou FALSE s il n existe pas. Voici un exemple d utilisation. Le script suivant : <?php echo getprotobyname("tcp")."<br />"; echo getprotobynumber(62)."<br />";?> pourra ner : 6 cftp 16.3. Les sockets Pour communiquer directement avec un service d une machine donnée, vous serez peut-être amené à 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 utilisiez les commandes de plus haut niveau (plus couramment utilisées). Le principe d utilisation est simple et se déroule en quatre grandes étapes : 1270

Les sockets 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 connexion L ouverture d une connexion se fait via la fonction fsockopen(). fsockopen() Ouvre une connexion sur une socket. $serveur $port $codeerreur $msgerreur $delaiexpiration resource fsockopen(string $serveur, int $port [, int &$codeerreur [, string &$msgerreur [, double $delaiexpiration]]]) Nom du serveur sur lequel doit se porter la connexion (éventuellement précédé de "udp://" pour une connexion UDP). Numéro du port sur lequel établir la connexion. Référence sur une variable dans laquelle sera copié le code d erreur levé. Référence sur une variable dans laquelle sera copié le message d erreur levé. Délai (en secondes) au-delà duquel la tentative de connexion doit être abandonnée (par défaut 60 secondes). Identifiant de connexion à la socket, ou FALSE en cas d erreur. La fonction fsockopen() possède un équivalent permettant l ouverture d une connexion persistante (nous n avons pas vérifié le caractère persistant et réutilisable de la connexion). Il s agit de la fonction pfsockopen(), qui possède exactement la même syntaxe que fsockopen(). Configuration de la connexion Il 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 lui soit adressé pour "rendre la main" au programme. Dans le cas contraire, elle est dite non bloquante, et la fonction de lecture ne simplement le contenu de la mémoire tampon 1271

Chapitre 16 La gestion des (espace stockant les messages nouvellement reçus) qui pourra éventuellement être vide (si le message n est pas encore arrivé). Par défaut, en l absence d appel à la fonction socket_set_blocking(), le mode de lecture est bloquant. socket_set_blocking() Détermine si le mode de lecture de la socket doit être ou non bloquant. $idsocket $modelecture boolean socket_set_blocking(resource $idsocket, boolean $modelecture) Identifiant de la socket tel que né par fsockopen(). TRUE si le mode de lecture doit être bloquant, FALSE sinon. FALSE en cas d échec, TRUE sinon. La durée de vie de la connexion à la socket peut être limitée par la fonction socket_set_timeout(). socket_set_timeout() Détermine la durée de vie maximale de la socket. $idsocket $secondes $microsecondes boolean socket_set_timeout(resource $idsocket, int $secondes, int $microsecondes) Identifiant de la socket tel que né par fsockopen(). Partie "secondes" de la durée de vie de la socket exprimée en "secondes:microsecondes". Partie "microsecondes" de la durée de vie de la socket exprimée en "secondes:microsecondes". FALSE en cas d échec, TRUE sinon. Lecture/écriture sur la socket La lecture et l écriture sur la socket s effectuent à l aide des fonctions qui ont déjà été vues dans le chapitre relatif aux fichiers. Vous pourrez ainsi utiliser fgets($idsocket, $nboctets); pour lire jusqu à $nboctets octets sur la socket, fputs($idsocket, $chaine); pour envoyer au serveur une chaîne de caractères via la socket, ou encore feof($idsocket); pour tester si la fin de fichier (fin d émission) a été atteinte. 1272

Les sockets Fermeture de la connexion Le 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 connexion Pour connaître l état d une socket, vous pouvez faire appel à la fonction socket_get_status(). socket_get_status() Retourne quelques informations sur l état de la socket. array socket_get_status(resource $idsocket) $idsocket Identifiant de la socket tel que né par fsockopen(). Tableau associatif possédant les clés : "time_out" associée à une valeur de type booléen précisant si la durée de vie de la socket a expiré ou non. "blocked" associée à une valeur de type booléen précisant si la lecture sur la socket se fait en mode bloquant ou non. "eof" associée à une valeur de type booléen précisant si un indicateur de fin de fichier a été détecté ou non. "unread_bytes" associée à une valeur de type entier précisant le nombre d octets actuellement dans la mémoire tampon de lecture de la socket. Application Pour mettre en place une communication via une socket, l essentiel est de bien connaître le langage de communication avec le serveur. Si vous avez conçu votre propre serveur, vous savez certainement 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 chapitre En-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 minimum communiquer l en-tête Host. Pour récupérer la page d accueil d un site, il faudra donc, par exemple, envoyer les instructions suivantes : GET / HTTP/1.1 Host: localhost 1273

Chapitre 16 La gestion des 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 minutes socket_set_blocking($idsocket, TRUE); socket_set_timeout($idsocket, 5, 0); // Envoi de données au serveur fputs($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éponse while (!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 OK Date: Tue, 28 May 2002 15:39:34 GMT Server: Apache/1.3.24 (Unix) Debian GNU/Linux mod_python/2.7.8 Python/1.5.2 Last-Modified: Fri, 24 May 2002 17:51:38 GMT ETag: "1088107-2e6e-3cee7daa" Accept-Ranges: bytes Content-Length: 11886 Content-Type: text/html 1274

FTP <!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 HTML de la page, mais également l en-tête né par le serveur (le début du code source se trouvant juste après la première ligne laissée vide). L utilisation des sockets permet ici de récupérer l en-tête né par le serveur (et ainsi, par exemple, 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 testant différentes valeurs pour "Accept-Language", etc.). 16.4. FTP Les fonctions de la bibliothèque FTP permettent d accéder en tant que client à un serveur FTP. Installation Sous Windows Que ce soit avec l archive du PHP Group ou avec EasyPHP, les fonctions FTP sont intégrées à PHP. Sous Linux Vous devrez recompiler PHP avec l option enable ftp (avec les versions 3 de PHP, il s agissait de l option with ftp). Vous pouvez vous reporter au chapitre "Prise en main" pour plus de détails sur la façon de compiler PHP. Vérification Pour vérifier que le support FTP est activé, appelez un script contenant <?php phpinfo();?>. Celui-ci doit alors laisser apparaître : 1275

Chapitre 16 La gestion des Figure 16.1 : phpinfo() FTP Les fonctions de base Connexion/déconnexion La première étape consiste, comme toujours, à se connecter au serveur. ftp_connect() Permet de se connecter à un serveur FTP. 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éfaut cette valeur vaut 90 secondes. 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. $idconnexion $identifiant $motdepasse boolean ftp_login(resource $idconnexion, string $identifiant, string $motdepasse) Identifiant de connexion obtenu par ftp_connect(). Identifiant (login) de l utilisateur. Mot de passe utilisateur. TRUE si la connexion a pu se faire, FALSE sinon. La déconnexion s effectuera, quant à elle, grâce à la fonction ftp_close(). 1276

FTP ftp_close() Permet de clore la connexion FTP. $idconnexion boolean ftp_close(resource $idconnexion) Identifiant de connexion obtenu par ftp_connect(). TRUE en cas de succès. ftp_close() possède un alias appelé ftp_quit(). Déplacement dans l arborescence Une fois que l on est identifié, il est possible d effectuer toutes les opérations courantes en ligne, comme, par exemple, changer de répertoire : ftp_chdir() Permet de changer de répertoire. $idconnexion $repertoire boolean ftp_chdir(resource $idconnexion, string $repertoire) Identifiant de connexion obtenu par ftp_connect(). Répertoire de destination. 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. boolean ftp_cdup(resource $idconnexion) $idconnexion Identifiant de connexion obtenu par ftp_connect(). TRUE en cas de succès, FALSE sinon. Liste du contenu d un répertoire Il est possible également de voir le contenu d un répertoire : 1277

Chapitre 16 La gestion des ftp_rawlist() Permet d obtenir une liste détaillée des fichiers d un répertoire (et éventuellement de ses sous-répertoires). Le résultat est identique à ls l. 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 né, FALSE (valeur par défaut) sinon. (Option disponible depuis PHP 4.3.0) 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. $idconnexion $repertoire array ftp_nlist(resource $idconnexion, string $repertoire) Identifiant de connexion obtenu par ftp_connect(). Répertoire à lister. Tableau des différents fichiers du répertoire. Création, suppression, renommage ftp_mkdir() Création d un nouveau répertoire. 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. TRUE si le répertoire a pu être créé, FALSE sinon. 1278

FTP ftp_rmdir() Permet d effacer un répertoire vide. $idconnexion $chemin boolean ftp_rmdir(resource $idconnexion, string $chemin) Identifiant de connexion obtenu par ftp_connect(). Répertoire à effacer avec, éventuellement, son chemin. TRUE si le répertoire a été effacé, FALSE sinon. ftp_delete() Permet d effacer un fichier. $idconnexion $chemin boolean ftp_delete(resource $idconnexion, string $chemin) Identifiant de connexion obtenu par ftp_connect(). Chemin du fichier à effacer avec, éventuellement, son chemin. TRUE si le fichier a été effacé, FALSE sinon. ftp_rename() Permet de renommer un fichier ou un répertoire. $idconnexion $anciennom $anciennom Transfert de fichiers boolean ftp_rename(resource $idconnexion, string $anciennom, $nouveaunom) Identifiant de connexion obtenu par ftp_connect(). Ancien nom du fichier ou répertoire. Nouveau nom du fichier ou répertoire. TRUE si le fichier ou répertoire a pu être renommé, FALSE sinon. Les fonctions de transfert de fichiers sont également disponibles. Il est ainsi possible de copier un 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. 1279

Chapitre 16 La gestion des $idconnexion $cheminfichierlocal boolean ftp_get(resource $idconnexion, string $cheminfichierlocal, string $cheminfichierdistant, int $mode [, int $offset]) Identifiant de connexion obtenu par ftp_connect(). 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 fichiers binaires). $offset Position dans le fichier distant du premier octet à transférer. (Paramètre ajouté depuis PHP 4.3.0) TRUE si le fichier a pu être copié, FALSE sinon. ftp_put() Télécharge un fichier du serveur web vers le serveur FTP. $idconnexion $fichierdistant $fichierlocal $mode $offset boolean ftp_put(resource $idconnexion, string $fichierdistant, string $fichierlocal, int $mode [, int $offset]) Identifiant de connexion obtenu par ftp_connect(). Destination sur le serveur web. Chemin sur le serveur web local. FTP_ASCII (pour les fichiers textes) ou FTP_BINARY (pour les fichiers binaires). Position dans le fichier local du premier octet à transférer. (Paramètre ajouté depuis PHP 4.3.0) TRUE si le fichier a pu être copié, FALSE sinon. Les fonctions ftp_get() et ftp_put() possèdent des variantes permettant d utiliser un pointeur vers un fichier. Cela permet de garder le fichier accessible en lecture ou écriture une fois copié. ftp_fget() Permet de télécharger un fichier d un serveur FTP dans un fichier (ou plus généralement un stream) ouvert. $idconnexion $idfichier boolean ftp_fget(resource $idconnexion, resource $idfichier, string $fichierdistant, int $mode [, int $offset]) Identifiant de connexion obtenu par ftp_connect(). Identifiant (obtenu par fopen()) du fichier à remplir. 1280

FTP $fichierdistant $mode $offset Nom du fichier distant à récupérer. FTP_ASCII (pour les fichiers textes) ou FTP_BINARY (pour les fichiers binaires). Position dans le fichier distant du premier octet à transférer. (Paramètre ajouté depuis PHP 4.3.0) 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 un serveur FTP. $idconnexion $fichierdistant $idfichier $mode $offset boolean ftp_fput(resource $idconnexion, string $fichierdistant, resource $idfichier, int $mode [, int $offset]) Identifiant de connexion obtenu par ftp_connect(). Nom qu aura le fichier sur le serveur FTP. Identifiant (obtenu par fopen()) du fichier à copier. FTP_ASCII (pour les fichiers textes) ou FTP_BINARY (pour les fichiers binaires). Position dans le fichier local du premier octet à transférer. (Paramètre ajouté depuis PHP 4.3.0) TRUE si le fichier a pu être mis sur le serveur FTP, FALSE sinon. Exemple d application Les fonctions vues jusque-là sont les fonctions les plus couramment utilisées, et nous permettent de réaliser un script de client FTP. Dans le script présenté, l utilisateur pourra naviguer sur le compte FTP, ajouter des fichiers, en supprimer, en renommer, ajouter et supprimer des répertoires, uploader ou télécharger des fichiers. 1281

Chapitre 16 La gestion des Figure 16.2 : Client FTP en PHP 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 secondes set_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 FTP ftp_login($connexion, $utilisateur, $motdepasse) or die("utilisateur inconnu ou mauvais mot de passe"); $repertoire = $_GET["repertoire"]!=""? $_GET["repertoire"] : "/"; 1282

FTP // Verifie si "effacer" est passé en parametre if ($_GET["effacer"]!="") { effacer($_get["effacer"], $repertoire); } // Verifie si "effacerrep" est passé en parametre if ($_GET["effacerrep"]!="") { effacerrep($_get["effacerrep"], $repertoire); } // Verifie si "telecharger" est passé en parametre if ($_GET["telecharger"]!="") { telecharger($_get["telecharger"], $repertoire); } // Verifie si "nouveaurep" est passé en parametre if ($_POST["nouveaurep"]!="") { nouveaurep($_post["nouveaurep"], $repertoire); } // Verifie si "ajouterfichier" est passé en parametre if ($_POST["ajouterfichier"]!="") { ajouterfichier($_post["ajouterfichier"], $repertoire); } // Verifie si "nouveaunom" est passe en parametre if ($_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 repertoire ftp_chdir($connexion, $repertoire); // Affichage du contenu du repertoire listerrepertoire($repertoire); ftp_close($connexion);?> </body> </html> <?php function listerrepertoire($repertoire) { global $connexion; echo "<h2><font color=\"green\">".$repertoire."</font></h2>\n"; // Affichage du lien vers le repertoire superieur if ($repertoire!="/") { echo "<a href=\"ftp1.php?repertoire=". 1283

Chapitre 16 La gestion des 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> </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 fichier function 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 vide function effacerrep($fichier, $repertoire) { global $connexion; 1284

FTP } if (@ftp_rmdir($connexion, $repertoire.$fichier)) echo "Le repertoire $fichier a ete supprime"; else echo "Impossible d effacer le repertoire $fichier assurez vous "."qu il est vide"; // Telecharge un fichier depuis le site FTP function 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"; else echo "Impossible d ouvrir le fichier $fichier"; } // Cree un repertoire function 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 fichier function 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 fichier function 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"; else echo "Impossible d ajouter $fichier"; }?> 1285

Chapitre 16 La gestion des Transfert de fichiers en mode asynchrone Les fonctions ftp_put(), ftp_get(), ftp_fput() et ftp_fget() sont des fonctions synchrones. C est à dire que lorsque le script PHP traite ces fonctions il ne fait plus rien d autre en 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 ne nent pas un booléen mais un entier dont les valeurs possibles sont les mêmes que celles nées par la fonction décrite ci-après. Une fois lancées, ces fonctions transfèrent bien les fichiers mais le script, lui, continue pour traiter les instructions suivantes. Pour savoir si la précédente opération est terminée vous devrez faire appel à la fonction ftp_nb_continue(). ftp_nb_continue Teste si la dernière opération FTP asynchrone lancée est terminée ou non. : int ftp_nb_continue(resource $idconnexion) $idconnexion Identifiant de connexion obtenu par ftp_connect(). FTP_MOREDATA si le transfert est en cours, FTP_FINISHED s il est terminé 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. boolean ftp_exec(resource $idconnexion, string $commande) $idconnexion Identifiant de connexion obtenu par ftp_connect(). $commande Commande à exécuter sur le serveur. TRUE en cas de succès, FALSE sinon. ftp_site() Envoie une commande à un serveur FTP de type SITE xxxx. boolean ftp_site(resource $IdConnexion, string $commande) $idconnexion Identifiant de connexion obtenu par ftp_connect(). $commande Commande à exécuter. TRUE en cas de succès, FALSE sinon. 1286