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