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

Post on 03-Jan-2016

14 views 0 download

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

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

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!