Upload
hamilton-mack
View
15
Download
0
Embed Size (px)
DESCRIPTION
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: Noyau SAPI Extensions PHP Statique ou Modulaire? Compiler, installer et tester les extensions Créer une extension. - PowerPoint PPT Presentation
Citation preview
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:
● 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:
– SquirrelMail requiert IMAP
– Horde , IMP et Turba requièrent LDAP
– Thumbnailer requiert GD
– PHP-nuke requiert MySQL
● Mises à jour difficiles (ie MySQL 3 -> 4)● Difficile de gérer de multiples serveurs
Solution: la modularisation● PHP3 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.
● PHP4 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
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● Apache2filter (vieux) / Apache2handler (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: MySQL, PostgreSQL, Oracle, ODBC,
cdb/db/gdbm, Dbase, FilePro, FrontBase, Informix, InterBase, Ingres2, MSSQL, SyBase...
● Clients: LDAP, NIS, SMTP/IMAP, SSL, IRC...
● Graphiques: GD, Exif, PDF
● Internationalisation: mbstring, gettext, pspell...
● E-Commerce: Verisign, TrustCommerce, SSL
● Streams (FTP/HTTP, compression, stdin...)
● XML/XSLT ● PEAR
Extensions externes (PEAR)● Il y avait trop de modules!● Les nouveaux sont maintenant sur PEAR
– PECL (pickle): PHP Extension Code Library
● PEAR fournit aussi des classes (includes)– 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 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
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 megs pour Apache2, 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 ~20K!
Compilation● Schéma classique:
– ./configure;make;make install
● Par défaut, compile CGI ● Il faut spécifier le SAPI, par exemple
– ./configure –with-apxs (ou –with-apxs2)
● 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:
– --disable-<ext> OU– --without-<ext>
● Pour activer une extension:– --enable-<ext> OU– --with-<ext>
● Pour compiler une extension en module externe:– --with-<ext>=shared
● --with réfère à des librairies ou fichiers externes
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 chercher la librairie, les URLs sont généralement indiqués.
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
à recompiler PHP au complet:– cd ext/ldap– phpize– ./configure– make– 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 « 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/xmlgcc -fPIC -shared -O2 -fomit-frame-pointer -pipe \-march=i586 -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 ..;./buildconf;./configure;make– ./sapi/cli/php -f ext/my_module/my_module.php– Congratulations! You have successfully modified
ext/my_module/config.m4. 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"● ./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!