Les extensions PHP SAPI et leur modularisation Par

  • Slides: 22
Download presentation
Les extensions PHP, SAPI et leur modularisation Par Jean-Michel Dault Jeudi le 20 mars

Les extensions PHP, SAPI et leur modularisation Par Jean-Michel Dault Jeudi le 20 mars 2003

Sommaire ● ● Motivation Sous le capot de PHP – – Structure interne Composantes:

Sommaire ● ● Motivation Sous le capot de PHP – – Structure interne Composantes: ● ● Noyau SAPI Extensions PHP Statique ou Modulaire? – – Compiler, installer et tester les extensions Créer une extension

Motivation ● Expérience de plusieurs ISPs ● Problèmes d'installation: – Squirrel. Mail requiert IMAP

Motivation ● Expérience de plusieurs ISPs ● Problèmes d'installation: – Squirrel. Mail requiert IMAP – Horde , IMP et Turba requièrent LDAP – Thumbnailer requiert GD – PHP-nuke requiert My. SQL ● Mises à jour difficiles (ie My. SQL 3 -> 4) ● Difficile de gérer de multiples serveurs

Solution: la modularisation ● ● ● PHP 3 a vu naître l'apparition du Zend

Solution: la modularisation ● ● ● PHP 3 a vu naître l'apparition du Zend Engine, qui a permis de séparer le « parsing » du code PHP de ses fonctions, ce qui a permis un début de modularisation. PHP 4 complète ce travail, supporte un plus grand nombre de serveurs web grâce au SAPI, et permet de compiler des modules à l'extérieur du noyau de PHP (un peu comme APXS le fait pour Apache) Tentons maintenant de disséquer cette bête ; -)

Structure interne de PHP

Structure interne de PHP

Organisation des sources ● ● ● Zend: Zend Engine (Interpréteur/Compilateur) TSRM: Thread-Safe ressource Manager

Organisation des sources ● ● ● Zend: Zend Engine (Interpréteur/Compilateur) TSRM: Thread-Safe ressource Manager main: coeur du langage sapi: interface pour le serveur web pear: PHP Extension and Application Registry tests: scripts qui vérifient les fonctionnalités et servent à la correction de bugs

Les SAPI ● ● ● ● Apache: pour Apache 1. 3 Apache 2 filter

Les SAPI ● ● ● ● Apache: pour Apache 1. 3 Apache 2 filter (vieux) / Apache 2 handler (nouv) CGI: n'importe quel serveur web (+Suexec) CLI: Ligne de commande, remplace Perl pour les scripts, création de GUI avec php-GTK ISAPI: pour Microsoft IIS Embed: intégrez dans un programme C AOL/netscape/roxen/servlet/thttpd/tux/. . .

Les Extensions ● Bases de données: My. SQL, Postgre. SQL, Oracle, ODBC, cdb/db/gdbm, Dbase,

Les Extensions ● Bases de données: My. SQL, Postgre. SQL, Oracle, ODBC, cdb/db/gdbm, Dbase, File. Pro, Front. Base, Informix, Inter. Base, Ingres 2, MSSQL, Sy. Base. . . ● ● ● ● Clients: LDAP, NIS, SMTP/IMAP, SSL, IRC. . . Graphiques: GD, Exif, PDF Internationalisation: mbstring, gettext, pspell. . . E-Commerce: Verisign, Trust. Commerce, SSL Streams (FTP/HTTP, compression, stdin. . . ) XML/XSLT PEAR

Extensions externes (PEAR) ● Il y avait trop de modules! ● Les nouveaux sont

Extensions externes (PEAR) ● Il y avait trop de modules! ● Les nouveaux sont maintenant sur PEAR – ● PEAR fournit aussi des classes (includes) – ● ● PECL (pickle): PHP Extension Code Library PFC: PHP Foundation Classes Paquetages GTK, pour créer des interfaces graphiques http: //pear. php. net

PHP Statique ● Avantages: – Pas besoin de charger le module, il est disponible

PHP Statique ● Avantages: – Pas besoin de charger le module, il est disponible immédiatement – Pas de fichiers supplémentaires sur le disque – Meilleure performance si bien configuré ● Inconvénients: – Un changement dans un module ou une des librairies requises entraîne automatiquement une recompilation – Taille du binaire plus grande, requiert plus de mémoire

PHP Dynamique ● Avantages: – – – Pas besoin de recompiler Installation et désinstallation

PHP Dynamique ● Avantages: – – – Pas besoin de recompiler Installation et désinstallation de modules à volonté Plus léger Mises à jour et réplication plus faciles Idéal pour développeurs ou hébergeurs ● Inconvénients: – Plus lent à démarrer (important pour CGI) – Plus de fichiers à manipuler (sauf RPM)

Pousser plus loin ● PHP pèse 3 megs – 3 megs pour Apache, 3

Pousser plus loin ● PHP pèse 3 megs – 3 megs pour Apache, 3 megs pour Apache 2, 3 megs pour CGI, 3 megs pour CLI, etc. – Perte d'espace, de performance et de mémoire, puisque chaque requête, même les images, prend 3 megs de mémoire sur le serveur. – Idée poussée par Mandrake: isoler le noyau de PHP (libphp_common), séparer les extensions, (php-imap, php-ldap), et séparer les SAPI. – Chaque SAPI prend maintenant ~20 K!

Compilation ● Schéma classique: – . /configure; make install ● Par défaut, compile CGI

Compilation ● Schéma classique: – . /configure; make install ● Par défaut, compile CGI ● Il faut spécifier le SAPI, par exemple – ● ● ● . /configure –with-apxs (ou –with-apxs 2) Spécifier –prefix, sinon utilise /usr/local Par défaut, seuls quelques extensions sont configurées. Important de faire. /configure –help !!!

Compilation (suite) ● Pour désactiver une extension: – – ● Pour activer une extension:

Compilation (suite) ● Pour désactiver une extension: – – ● Pour activer une extension: – – ● --enable-<ext> OU --with-<ext> Pour compiler une extension en module externe: – ● --disable-<ext> OU --without-<ext> --with-<ext>=shared --with réfère à des librairies ou fichiers externes

Librairies et entêtes externes ● ● ● Pour compiler la plupart des extensions, il

Librairies et entêtes externes ● ● ● Pour compiler la plupart des extensions, il faut des librairies et entêtes externes Par exemple, pour générer du flash, il faut la librairie Ming. Dans le cas où ces librairies ne sont pas installées dans /usr, il faut spécifier le répertoire. – ● Exemple: --with-ming=shared, /usr/local Lire la documentation PHP, à la section traitant de l'extension pour savoir où aller cher la librairie, les URLs sont généralement indiqués.

Installation ● Faire simplement un « make install » en root, OU – ●

Installation ● Faire simplement un « make install » en root, OU – ● make INSTALL_ROOT=/tmp/php install (ceci est très pratique, on peut faire par la suite un tar. gz du répertoire et l'installer sur plusieurs machines) On peut aussi faire un « make install-cli » pour installer l'exécutable php – Attention, il faut utiliser aussi le install root si on l'a utilisé pour le make install – Avant de faire make install-cli, renommer /usr/local/bin/php en php-cgi pour avoir les deux.

Compilation de modules externes ● On peut compiler (ou recompiler) des modules sans avoir

Compilation de modules externes ● On peut compiler (ou recompiler) des modules sans avoir à recompiler PHP au complet: – – – ● cd ext/ldap phpize. /configure make install L'extension est automatiquement installée, il n'y a plus qu'à dire à PHP de la prendre en compte.

Façons de gérer les modules ● ● Utiliser des rpms ou. deb Ajouter «

Façons de gérer les modules ● ● Utiliser des rpms ou. deb Ajouter « extension=module. so » dans le php. ini Utiliser la fonction dl(): rien à modifier (simplement inclure le module dans le code php), mais plus lent puisque les scripts doivent charger l'extension à chaque exécution Créer des fichiers ini séparés (config-file-dir): nouvelle fonctionnalité de PHP 4. 3. x, utilisée par Mandrake. Ex: /etc/php/34_mysql. ini

Pour les purs et durs ; -) cd /etc/xml gcc -f. PIC -shared -O

Pour les purs et durs ; -) cd /etc/xml gcc -f. PIC -shared -O 2 -fomit-frame-pointer -pipe -march=i 586 -mcpu=pentiumpro -I. `php-config --includes` -I/usr/include/xml -DCOMPILE_DL_XML -DHAVE_LIBEXPAT -DHAVE_DLFCN_H xml. c -o xml. so -lexpat -lc Dans ce cas, une compilation manuelle nous permet d'utiliser des optimisations Pentium, et d'utiliser la librairie expat du système au lieu de celle incluse dans PHP (qui cause des problèmes avec mod_perl et Axkit).

Création d'extensions ● Création du squelette: – – ● cd ext; ext_skel –extname=my_module cd.

Création d'extensions ● Création du squelette: – – ● cd ext; ext_skel –extname=my_module cd. . ; . /buildconf; . /configure; make. /sapi/cli/php -f ext/my_module. php Congratulations! You have successfully modified ext/my_module/config. m 4. Module my_module is now compiled into PHP. Lecture de la documentation: – http: //www. zend. com/apidoc/

Tester PHP ● ● ● export TEST_PHP_EXECUTABLE=". /sapi/cli/php run-tests. php Cette procédure effectue plus

Tester PHP ● ● ● export TEST_PHP_EXECUTABLE=". /sapi/cli/php run-tests. php Cette procédure effectue plus de 400 tests Si un test échoue, vous pouvez regarder le fichier. phpt pour savoir où ça plante En plus des tests normaux, chaque bug vérifié contient son ficher bug#####. phpt, il est donc aisé de vérifier quels bugs ont été corrigés. Les masos prendront les. phpt du CVS pour être sûrs d'avoir les bug reports les plus à jour ; -)

Questions? Merci de votre participation!

Questions? Merci de votre participation!