Mon premier programme C/PHP
Par cgo2, lundi 2 mai 2005 à 11:16 :: Programmation :: #7 :: rss
Hello world
En guise d'"Hello World", nous allons essayer d'executer la commande phpinfo()
.
Avant tout, il faut initialiser le module php embed. Tout ceci n'�tant absolument pas document�, je ne saurais dire � quoi correspondent les param�tres.
static char *argv[2] = {"monboprog", NULL}; if ( php_embed_init(1, argv PTSRMLS_CC) == FAILURE ) { puts ("Impossible d'initialiser PHP"); return -1; }
Maintenant on peut executer une commande. On utilise zend_eval_string
qui prend comme premier param�tre la commande � executer. Je ne sais pas � quoi correspond le deuxi�me (je laisse NULL
). Quant au dernier, apparement on peut mettre n'importe quoi... Allez comprendre !
Zend (le parseur php) fournis des macros imitant le try-catch du C++, permettant de recuperer les erreurs de php. Il n'y a donc qu'� les utiliser. Et voila ce que �a donne :
zend_first_try { if ( zend_eval_string("phpinfo();", NULL, "php embed roulez") == SUCCESS ) puts("Commande execut�e avec succ�s"); else puts("Impossible d'executer la commande"); } zend_catch { printf ("Exception %d", EG(exit_status)); } zend_end_try();
Enfin, on arrette php avec la commande suivante :
php_embed_shutdown(TSRMLS_C);
Il ne manque plus qu'� inclure php_embed.h
, et on peut essayer de le compiler. Le programme complet d'exemple est disponible par ici
Compilation
Ca c'est la partie la plus gal�re, surtout quand rien n'est document�. Je tiens d'ailleurs � remercier kermit, une star du Makefile, sans qui je ne serais sans doute jamais arriv� � compiler cette saloperie de programme.
En fait, php_embed.h
demande pleins d'autres fichiers d'entetes, situ�s un peu partout dans les sources de PHP. Il faut donc rajouter un paquet de param�tres d'inclusion � gcc
. Dans un makefile, �a donne :
# chemin des sources de php PHPPATH=/home/cgo2/documents/prog/php/php-5.0.2 PHPFLAGS=-I$(PHPPATH) -I$(PHPPATH)/Zend -I$(PHPPATH)/TSRM -I$(PHPPATH)/sapi/embed
Pour le linkage, il faut utiliser la lib que l'on a compil� :
LDFLAGS=-L$(PHPPATH)/libs LIBS=-lphp5
Le makefile pour ce programme d'exemple n'est pas encore parfait, puisque trop de param�tres sont hardcod�s, mais bon...
Execution
Premier test :
$ ./monboprog ./monboprog: error while loading shared libraries: libphp5.so: cannot open shared object file: No such file or directory
Pas grave, il suffit d'ajouter le chemin de la libs dans la variable d'environnement qui va bien :
$ export LD_LIBRARY_PATH=~/documents/prog/php/php-5.0.2/libs/
Et voila :)
Conclusion
Il reste encore beaucoup � faire pour pouvoir embarquer facilement php : faciliter la compilation et le linkage (tout le monde n'a pas les sources de php sous la main), et �galement l'execution. Quant au code, dans un premier temps un d�coupage en fonctions permettant d'eviter de manipuler Zend directement s'impose. Il faut ensuite voir comment inclure des fichiers php, exporter des fonctions C pour les utiliser dans les scripts, etc... Mais au moins avec cet exemple vous pourrez dire : "moi aussi j'ai r�ussi � embarquer php" !
Quelques liens
- LE programme sans lequel on aurait rien reussi : le module php-irssi qui permet de script irssi avec php. Malheureusement il n'y a aucun site officiel, et le projet semble mort. On peut encore recuprer les sources sur le CVS de php
- Un PDF interressant par l'auteur de php-irssi
0 commentaire
Aucun commentaire pour le moment.
Ajouter un commentaire
Vous voulez lancer un d�bat ou poser des questions autour du sujet ? Dans ce cas, utilisez plut�t le forum !