peLmeL.org
Accueil du site > peLmeL Blog > Résolution d’un développeur PHP > Compiler PHP sous linux

Compiler PHP sous linux

jeudi 31 juillet 2008, par Brice Favre


Cet article à pour but d’éviter à certains des expériences malheureuses dans la compilation de PHP sous linux

Tout a commencé un certain matin. Un collègue, excédé par les comportements du système d’exploitation qu’il utilisait quotidiennement décide d’en changer. Un CD lui est passé et une bientôt une ubuntu s’offre une colocation sur son disque dur. Fin de l’histoire ? Non pas encore.

Installation de PHP

Nous passerons les petits problèmes d’incompatibilité, de "je retrouve pas mon windows" ou autre aspect irrationnels pour nous concentrer sur quelques points qui posent problèmes.

Tout d’abord l’un des points importants de notre métier est la programmation de site web. Idéalement nous aimerions retrouver sur nos postes la version de PHP utilisés sur nos serveurs. Comme nous avons un très bon administrateur qui se tient à jour, nous utilisons la 5.2.6. Problème, le héron hardi ne propose que la 5.2.4. Il faudra en passer par la phase de compilation.

Ubuntu a pas mal de qualités et de défauts [1]. Ce que j’ai toujours trouvé assez aberrant c’est qu’elle ne met pas à disposition les outils de compilation par défaut. Sans doute qu’une compilation fait peur au commun des mortels, mais dans les faits c’est bien souvent pratique pour se faire une petite configuration aux petits oignons.

Pour mener à bien mon opération, voici la liste des paquets à installer :


apt-get install build-essential apache2-threaded-dev flex bison libsqlite3-dev libxml2-dev subversion cvs msttcorefonts apache2-threaded

J’ai préféré regrouper tout cela en une seule ligne pour éviter les multiples commandes à taper.

Ca se complique

Comme évoqué plus haut, l’objectif de passer sous Linux est d’avoir un serveur semblable à un serveur en prod. Un petit tour sur php.net permet de récupérer la dernière version de PHP.

Afin d’être être le plus près possible de la configuration on récupère, via phpinfo (), la ligne de configuration :


'./configure' '--with-mysql=shared' '--with-pdo-mysql' '--with-pdo-oci=instantclient,/usr/lib/oracle,10.2.0.3' '--includedir=/usr/lib/oracle/instantclient/sdk' '--with-apxs2=/usr/sbin/apxs' '--prefix=/usr' '--with-xml' '--with-libxml' '--enable-xml' '--with-dom' '--with-zlib' '--with-oci8=instantclient,/usr/lib/oracle,10.2.0.3' '--enable-soap' '--enable-sockets' '--with-curl' '--with-tidy' '--with-gd'

Euh d’accord, si vous voulez.

Après quelques essais, il s’avère nécessaire, pour mener à bien le configure, d’installer les librairies qui manquent :


# --with-curl :
sudo apt-get install libcurl3-dev
# --with-gd :
sudo apt-get install libpng3-dev
# --with-pdo-mysql
sudo apt-get install libmysqlclient15-dev
# --with-tidy
sudo apt-get install libtidydev

Maintenant attaquons nous à oracle, pour celà j’ai suivi une partie de cet tutorial : http://ubuntuforums.org/showthread.php ?t=92528.

Dans le principe je vous invite à suivre le premier chapitre, c’est à dire à télécharger le SDK et le client basic de Oracle (j’ai pris la version 10.2.0.3 soit instantclient-basic-linux32-10.2.0.3-20061115.zip et instantclient-sdk-linux32-10.2.0.3-20061115.zip. Ensuite, j’ai créé un répertoire /opt/oracle/instanclient et effectuer le ldconfig et la création des liens :


ln -s libclntsh.so.10.1 libclntsh.so
ln -s libocci.so.10.1 libocci.so

Tout le reste est à faire dans le configure. En enlevant les options qui ne servent plus à rien ça donne :


'./configure' '--with-mysql=shared' '--with-pdo-mysql' '--with-pdo-oci=shared,instantclient,/opt/oracle/instantclient,10.2.0.3' '--with-apxs2=/usr/bin/apxs2' '--prefix=/usr''--enable-xml' '--with-zlib' '--with-oci8=shared,instantclient,/opt/oracle/instantclient,10.2.0.3' '--enable-soap' '--enable-sockets' '--with-curl' '--with-tidy' '--with-gd'

Après la passe de configuration, il me suffit de compiler (make) pour obtenir PHP 5.2.6 et d’effectuer un sudo make install pour copier le module de PHP dans le répertoire d’extensions du serveur apache.

Phase Configuration

Après avoir compiler les sources, il me faut maintenant mettre en place la configuration permettant à Apache d’utiliser le moteur PHP. Autre point important, les librairies Oracle (OCI et PDO_OCI) ont été compilées dans des librairies. Il faudra les indiquer dans le fichier php.ini pour qu’elles soient prises en compte.

Premier point important, il faut indiquer à Apache qu’il dispose d’un nouveau module, et ce que ce module peut traiter. Le make install ne le fait pas pour vous (en tout cas pas sous Ubuntu), donc il m’a fallur créer les deux fichiers php5.conf et php5.load dans le répertoire /etc/apache2/mods-avalaibles/

php5.load


LoadModule php5_module /usr/lib/apache2/modules/libphp5.so

php5.conf


<IfModule mod_php5.c>
 AddType application/x-httpd-php .php .phtml .php3
 AddType application/x-httpd-php-source .phps
 PhpIniDir /etc/apache2/php
</IfModule>

Ces deux fichiers ont pour but de configurer le module PHP5 pour apache selon une nouvelle configuration permettant plus facilement de rendre actif ou inactif un module. Dans les faits, il faut indiquer ensuite à apache que vous voulez rendre actif le module par la commande suivante :


sudo a2enmod php5

J’ai mis en place une directive PHPIniDir. Elle permet d’indiquer dans quel répertoire se trouve le fichier de configuration php.ini qui sert à définir des variables d’initialisations au moteur php. Dans les sources on trouve différent modèle. J’ai, pour ma part, copié le fichier php.ini-recommended. Ne pas oublié de créer le répertoire /etc/apache2/php avant de le faire.


sudo mkdir /etc/apache2/php
cp php.ini-recommended /etc/apache2/php/php.ini

Dernier point, la gestion des extensions. Comme indiquer plus haut, les drivers mysql, OCI et PDO_OCI ont été compiler dans des classes séparées (option shared). J’ai commencé par placer les librairies créé dans un répertoire propre à celles-ci : /usr/lib/php5. Il suffit ensuite de modifier le fichier php.ini, ajouter la directive extension_dir et charger les librairie mysql.so, oci8.so et pdo_oci8.so qui ont été générés dans les répertoires de compilation :


extension_dir = /usr/lib/php5
extension = mysql.so
extension = oci8.so
extension = pdo_oci8.so

On redémarre le tout et ça fonctionne.

Autres solutions

Ceci est un premier jet. Il faudrait sans doute rationaliser ça, créer un script d’installation pouvant mettre à jour le système sans trop de soucis, mettre en place un système incorporant le programme dans la gestion des dépendances d’ubuntu. Les avis sont les bienvenues.

La critique classique des utilisateurs de windows est de dire que l’installation d’un wampserver est plus aisé. Effectivement, mais ça existe aussi sous linux. On peut citer le Zend Core ou XAMPP parmi les packages AMP.

A l’inverse, on peut aller encore plus loin avec une compilation d’Apache et de placer le tout dans un répertoire /opt. On peut même envisager de faire tourner plusieurs serveurs apaches, avec plusieurs versions de PHP (5.2, 5.3) sur plusieurs ports.

Bref comme d’habitude, on a plutôt l’embarras du choix (pour pas dire l’inverse). Bonne compilation.

Notes

[1] Rappel : Ubuntu est un mot d’origine africaine pour signifier "Je ne sais pas configurer Debian"

Répondre à cet article

1 Message

  • Compiler PHP sous linux

    20 septembre 2009 22:08, par jerry

    bonjour et merci pour votre article il m a grandement aidé !

    j en profite pour vous faire savoir quelques remarques :

    je pense que vous devriez preciser que le prerequis est qu’apache 2 soit installé ( j ai un doute mais ca m a vallu quelques erreurs )

    aussi,

    voici les bonnes valeurs que j ai eu a entrer :
    — with-apxs2=/usr/bin/apxs2

    — with-libxml-dir

    Répondre à ce message


Suivre la vie du site RSS 2.0 | Plan du site | Espace privé | SPIP | squelette