Professional Documents
Culture Documents
www.phpsolmag.org N'5/2006
PHPSolutions
prévue).Cette démarchepermet d'éco- de générerune table avec des informa- de placer les deux balises immédiate-
nomiserbeaucoupde tempset de stress tions; elle s'afficheradans la page re- ment en dessousde la balise ouvrante
que vous perdrezen tentantd'effectuer tournéepâr phpinroo . Le scriptcharge < e x t e n s i o n > .
toutce travailvous-même. le nom de I'extensiondepuis le para- La balise (maintainers> Coîtehant la
Avant d'écrireI'extensionà I'aidede mètre namede la balise <extension>. Si balise (mainrainer) (décrivantchaque
XML,il faut installerle script CodeGen_ vous voulez placer une brève informa- concepteur)est responsablede placer
PECL.ll est possiblede le faire de plu- tion dans phpinfoo concernantI'exten- les informations sur les concepteursde
sieursmanières.Si vous disposezd'une sion (résumé),placez-laà I'intérieurde I'extension (Listing1). Une telle descrip-
connexionInternet,il est recommandé la balise <summary> i tion comprendson nom (par exemple
d'efiectuerla commandesuivanteau ni- le pseudonyme),placé dans la balise
veaudu terminal: <summary> <user>,le nom et le prénomplacésdans
Exemple de Lrextension PHP - RPN la balise<name>, I'adressede message-
pear install -o Codegen_PECL </ surunary> rie électronique,placée dans la balise
<emair> et le rôlequ'iljouedansl'équipe
Cette commandepermetde télécharger ll faut placerde manièreanalogueI'infor- de personnesresponsables du travailsur
et d'installerle script.Si vous n'avezpas mationprincipalesur I'extensiondans le I'extension; cettedernièreinformationse
de connexionIntemet,regardezle CD bloc <oescriprion>.Les concepteurs du trouvedans la balise<role>. La balise
joint au magazine:il contientles archi- script CodeGen_PECL recommandent (mainrainers) peut bien évidemment
ves avec le script,version1.0.0.Afin de
l'installer,passez au répertoirecontenant Démarragerapide
ces archiveset effectuezles commandes Vous pouvezdétjàvoir le résultatdu fonctionnementde I'extensioniciprésentée.N'oubliez
suivantes: pgs toutefoisque vous aurez besoindu système Unix (p. ex. Linux ou FreeBSD)pour la
compiler.En théorie, les sources contiennentles fichiers du projet pour Visual Studio, gé-
nérés automatiquementpar le script CodeGen_PECL; son concepteur n'a pas testé s'il
pear install CodeGen-1.0.0.t92
était possiblede compilercette extensionsous Windows.
pear install CodeGen-PECL-l.0.0.t92 Afin d'efiectuer la compilation,vous devez disposer de PHP et des fichiers d'en-tête
installés(les fichiersavec l'extension.h utilisésdans les programmesécrits en G) ainsi
que du compilateurC et des outils associés(gcc, make etc.).
Cettecommandepermetde bien installer
Afin de compiler I'extensiondans votre système, copiez ses sources dans votre dis-
le scriptCodeGen,nécessaireà un fonc- que, allez dans le répertoireavec I'extensionet tapez la commandesuivante :
tionnementconect par CodeGen_PECL
et parCodeGen_PECL. phpize; ./configure; make; sudo make install
I'extensionpour calculerI'expression(elle ll suffit à présentde redémaner le serveur HTTP pour que tout fonctionnebien.
seratransforméeau formatde la Notation
PolonaiseInverse et calculée ensuite; NotationPolonaiselnverse
vous trouverez davantaged'informations La notationpolonaiseinverse est une méthodespécifique,permettrantd'écrire les formules
mathématiques.Puisqu'ony insère le caractèrede I'opérationefrectuéeaprès les opéran-
sur NPf dans I'encadrêNotationPolonaise
des, les parenthèsesdeviennentinutiles.À titre d'exemple,I'expression:
lnverse).Placez donc la descriptionde
I'extensionà I'intérieur
du blocsuivant: ,]-5-5)/2
N'5/2006
PHPSolutions wwwphpsolmag.org
contenir plusieurs blocs (maintainer)
E gil Ur lpdûûb lod 51P avec les descriptionsde chaque membre
Ël*r.' I E. de l'équipe.
--
itr.?, ttg ZLù-*.tlff1gl.tr@..4? ------ - - [ s [ i G - e * o " * ' . r , &i 6ô Ajoutez à présent I'informationsur la
version de votre extension. Pour ce fai-
r e , v o u s d i s p o s e zd u b l o c < c h a n s e l o g >
contenant les balises <retease>qui dé-
crivent chaque version. ll est possible
de décrire chaque édition à I'aide du
numéro placé dans la balise (versi.on),
de la date d'édition placée dans la
balise (dare>, du statut d'édition (par
exemple beta, stable etc.) dans la bali-
sê <srate> et de la descriptiond'édition
placée dans la balise <nores>.Le bloc
<chanseros>peut contenir la description
de plusieurs versions. Le Listing 2 pre-
sente la description de l'édition de votre
æ.rlon
extension.
Dans pnpinro o , il est Possible de
placer une image mais vous pouvez par-
Figure 1. Exempled'informationsurfertension,généréed'aprèslesdonnées fois avoir des problèmes pour I'afficher
contenuesdansle fichierXML correctement. Si vous voulez le tenter,
utilisez la balise <roso>. Cette balise
prend deux arguments I src QUi est le
des membresde l'équipequitravaillentsur l'ertension
Listing 1. Description
nom du fichier avec I'image et mimetype
..maintainers). qui déterminele Wpe MIME de I'image(il
est possible d'omettre ce paramètre, en
.maintainer.,
ce qui concerne les images au format gif,
. u s e r . . S t a n i s z c z a k . /t u s e r . ,
' n a m e .M a r c i n S t a n i s z c z a k / n a m e
png ou jpeg car le script CodeGen-PECL
. e m a i ] . ' m a r c i n G s t a n i s z c z a k . p I . / e m ai I : est ici capable de reconnaÎtre le type de
, r o l e : ' l - e a d ' :/ r o l e : ' I'image):
, /maintainer:
( 1 o g o s r c = " c a 1 c .g i f "
.:!-vous pouvez placer ici plus de blocs maintainer --:
mimetype=" image / gif" / >
, /maintainers:,
PHPSolutions
N'5/2006 www.phpsolmag,org
peut prendre I'une des valeurs pré-
Tabfeau3. Valeursquepeutprendrele paramètreaccessde la balise<phpini>: où
peuton modifierla valeurde la variabledonnée ? sentées dans le Tableau3.
RPN_functionslI .
function_entry
name- est le nom de la variable,
PHP_FElrpn_caIcuIation, NULL)
rype - détermine le type de la varia-
P H P _ F E( r p n _ e r r o r m s g , NULL)
ble (voir le Tableau 1), P H P _ F E( r p n _ e r r o r , NULL)
varue - détermine la valeur que doit , NULL, NULL, NULL ,
prendre la variable si elle n'est pas
définie dans le fichier php.ini (ou
à I'extension,il faut donc connaîtreles de les utiliserpour vérifiersi le nombre char* type spec, ... )
un tableau avec ce caractère -.elle cée dans la liste de paramètresde la zrr:l ** nhioni-
v v J v v e
nn
r f l
Zva].* fUnCtiOn name,
retourne la valeur du type zva).*, fonction zend parse parametersderrière zvaL* retval_ptr, zend_uint param_count,
pastransmisepar la référence,
Z V A L S T R I N Gr ' ,f u n c ,
"str replace"
r - signifieque le paramètreprécé-
Z V A L S T R I N G ( p a r a m0s , i l [ " , 0 ) ;
dentpeutprendrela valeurNULL. Z V A LS T R I N G ( p a r a n s ' 1 ' ", ( " , 0 ) ;
Z V A L S T R I N G ( p a r a m s ' 2, p h r a s e , 0 ) ;
Les valeurs o et s pêuVêît être à I'origine calI_user_function ( C G( f u n c t i o n _ t a b I e ) ,
(zvaL")NULL, , r f u n c , / , p h r a s e f 3 , p a r a n s T S R M L SC C ) ;
de doute car elles utilisentdeux paramè-
tres. Si vous utilisez la valeur s, cofillrlê
Z V A L S T R I N G ( p a r a m s i 0 l ," 1 " , 0);
le présente le Listing 7, aussi bien I'en- Z V A LS T R I N G ( p a r a m s i l l ", ) " , 0);
trée (dans la variable phrase) que sa Z V A L S T R I N G ( p a r a m s i 2 l ,p h r a s e , 0 ) ;
longueur (dans la variable phrase_ren) c a L l u s e r f u n c t i o n ( C G (f u n c t i o n t a b L e ) ,
( z v a l { - ) N U L L , &f u n c , t p h r a s e , 3 , p a r a m s T S R M L S _
seront retournées. Si la fonction atten-
dait un autre paramètre après I'entrée,
N'5/2006
PHPSolutions www.phpsolmag.org
les fonctionsproposéespar I'extension, où sont déclarées les variables globales. derniersparamètressont des structures
lesfonctionsinternesde ZendAPI doivent Les paramètres de la macro sont les qui décriventlesvariables globalesde vo-
être déclaréesavantI'utilisation dans une suivants: nom de la variable sous lequel tre application ; vous ne devez pas vous
structureadéquate.Regardezdonc les elle doit être modifiée au niveau du fichier en préoccuper car même si vous voulez
Listings9 et 10. Commevous le devinez php.ini; la valeur de la variable à utiliser ajouter manuellement la variable modi-
probablement,la structurezend_modure_si elle n'est pas envoyée dans le fichier fiée au niveaudu fichierphp.ini,lesdeux
enrry sert à écrireI'extension créée.Ses php.ini; la manière d'accès à la variable derniersparamètresrestenttels que les a
premierschampssonttoujoursremplacés (valeurspossibles: pnp_rNr_sysrEM, pHp_ générésle scriptCodeGen_PECL.
par la macro sTANDARD_MoDULE_HEADRES, INI USER, P H P I N I A I I E t P H P I N I P E R DIR ll anive parfois que vous voudriez
les autres champs constituentle nom Tableau 3). Un autre paramètre est le écrire votreproprefonctionexécutéeauto-
de I'extension, qui est, dans cet article, nom de la méthode à appeler au moment matiquement lors de la modification de la
npr.r. Ensuite,précisezle nom du tableau de la modification de la valeur de la va- valeur de la variable avec php.inl. C'est
décrivant les fonctions proposées par riable. Les fonctions standards de gestion une tâche très simple et consiste à utiliser
I'extension(cettestructures'appelledans d'événement de I'actualisationsont dis- une macroappropriéelors de la réalisa-
cet article RpN_funcrions Listing 6). - ponibles. Elles s'appellent onupdateryp, tion de la fonction:
Les cinq autres champsde la structure où typ est le nom du type de la variable :
constituentles déclarationsde fonctions L o n g , S t r i n g , B o o l , D o u b l - e e t C . L g C i n - PHP INI MH(OnChangeQueueSize)
MrNFo. Si I'unede ces fonctionsest inu- de la variabledu fichier php.ini. Les deux s ' é l - è v e à % s c b r > " , n e w v a l - u e );
STANDARDMODULE PROPERTIES. P H P M T N I T ( R P N ),
desfonctionsestcrééeà I'aide
la définition ,
desmacrosappropriées. Cesmacross'ap-
pellent PHP_nomDeFonction_FUNcTroN, Où
Listing 10. Sfrucfurede zend_module_entry
le nomde la fonction,c'estrespectivement typedef struct zend_module_entry;
_zend_modufe_entry
MINTT, MSHITDOWN, RINIT, N S H U T O O ME
It
Variables php.ini
ll ne vous manqueque les optionsde lec- Listing 11. Vaiables configurables déclarées à l'aide des macros sonf chargées
ture de valeursde variablesconfigurables au niveau de php.ini
au niveau du fichierphp.ini.Ces varia-
PHPINI BEGIN()
bles sont déclaréesà I'aidedes macros
( "YR P N .r p n _ s t a c k _ s j .z e " ,
STD_PHP_INI_ENTR " 5 0" , PHP_INI-PERDIR,
(Listing11).
OnUpdateLong, rpn_stack_size, zend_RPN_gIoba1s, RPN-g1obals1
La macro srD PHPrNr ENTRY dit ( "YR P N .r p n _ q u e u e _ s i z e " ,
STD_PHP_INI_ENTR " 15 0" , PHP_INI_PERDIR,
à PHP quelle variable globale doit être OnUpdateLong, rpn_queue_size, zend_RPN_g1obals, RPN-globa1s1
r.ll{ 1625
r22+[(98/32).r RPN.rpn queue size =
taill,e de Ia queue
Erprcrrion: Crlculrtr
Pourterminer
Cet articlen'a pas tout dit sur la réalisa-
tiondes extensionspourPHP.L'absence
d'une bonne documentation rend sûre-
ment la vie difficile.D'un autre côté, un
grand nombre d'extensionsstandards
disponiblesavec les sources PHP ce
qui aide beaucoupà écrirevos propres
extensions.ll faut toutefoisêtre préparé
Figure 3. Fonctionnement d'un exemple d'application qui utilise l'extension créée à analyserle code étranger,par exem-
ple, les paramètrespris par la macroqui
return SUCCESS; fonction à appeler lors de la suppression vousintéresse.
) de variables. Si vous vous intéressezau sujet des
ll ne faut pas oublier non plus d'ini- extensionset vous voulez approfondir
Comme vous pouvez le constater,la tialiserla macro REGTsTER rNr ENTRTES o vos connaissances dans ce domaine,je
nouvellevaleuresttransmisedansla va- dans I'appel de la fonction MrNrr et les vous inviteà modifierdans un premier
riablenewvat-ue.Bienévidemment, pour macros uNREGTsTER rNr ENTRTES
o dans temps I'extension créée.Elle a été créée
que cettefonctionsoitappeléeautomati- la fonctionMSHUTDowN. volontairement de manièreà pouvoirla
quementaprès la modificationde la va- Maintenant,vous pouvez appeler les modifierà votreguise.Commencezà éh-
leur qlrel,e_size, plâcêz son nom en tant variables globales à l'aide de la macro minerI'option de la pileet de
d'initialisation
que le quatrièmeparamètrede la macro N O M D E L E X T E N S I O GN ( n o m d e l - a v a r i a b l e ) la queuede sorteque leurtailles'adapte
srD_pHp_rNr_ENrRy. est souvent d O n C n p u _ c ( n o m d e f a v a r i a b l e ) - f ê S â f -
Puisqu'il aux besoins(cettetâchen'estpas difficile
nécessaire d'avoiraussila longueurde dez le Listing4 ; on y appelle les variables en C). Ensuite,vous pouvezmodifierle
la nouvellevaleur(p.ex. lorsqu'ils'agit r p n _ s t a c k _ s i z e ê t f p n _ q u e u e _ s i z e d a n s l e code de sorteque la pile et la queuene
d'uneentrée),nous présentonsci-après code de la fonctionRrNrr et nsnuoowx. retiennentpas les valeursdu type doubr-e
de la macroPHPrNr MH:
la définition ou char mais immédiatement les valeurs
Compilation zvalde PHP.r
#define PHP INI MH (name) et lancement
*entry, Testez à présent votre extension.
int name(php ini entry
Sur Internet
char *new value, Grâce aux fichiersgénéréspar le script
uint new value fenqth, CodeGen_PECL, la compilationet I'instal- . http://www.php.neUmanual/en/
*mh arg1, lationsont très simples.Ellesconsistent internals.php - informationssur
void
ZendAPI qui se trouventdans la
void *mh arg2, void *mh arg3) à exécuterlescommandes suivantesdans
documentationofficielle PHP
contenantI'extension
le répertoire : - assez modestes,hélas
Les paramètresde la fonction créée . http://somabo.de/talks/- docu-
à I'aidede cettemacrosontles suivants: phpi ze ments provenantdes conférences
diversesconcernantPHP - vous y
la structuredécrivantla variable,la nou- . / c o n f i g u r e
trouverezdeux bonnesprésenta-
vellevaleurde la variable,la longueurde m a k e tions sur la questiondes exten-
la variableet trois argumentsfacultatifs s u d o m a k e i . n s t a l l s i o n sp o u r P H P
qui ne sontpas pourI'instantimportants. . http://www.zend.com/php/
intern aIs/exte nsi on -writing 1.p hp
Avant de chargerles variablesdéfi- Maintenant, il suffit d'ajouter une ligne - premièrepartiedu tutoriel
nies ci-dessus,il faut appelerla macro demandant de charger l'extension dans expliquantcommentécrireles
zEND rNrr MoDULEGLoBALSdans la fonc- le fichier php.ini (dans I'exemple d'ex- extensionsà I'aidede Zend API
tension, cette ligne se présente ainsi : . http://www.zend.com/php/
tion r,rrrurr.Cette macro prend trois para-
internaIs/extensi on -writing2.p hp
mètres : le nom de I'extension (ici, c'est extension:RpN.so)et de redémarrer le - deuxièmepartiedu tutorielsus-
nex), le nom de la fonction à appeler lors serveur HTTP. ll est également possible mentionné
de variableset le nom de la
d'initialisation de modifier la taille de la pile et de la