Un serveur Apache et des versions de PHP à la douzaine

Ça y est, vous êtes un développeur PHP heureux - voir même comblé : on vous a enfin confié un développement en PHP 5.4 ! A vous les joies des traits et autres dé-référencements de tableaux (et la super syntaxe ['hey' => 'you']) sans oublier l'amélioration des fonctions anonymes et la disparition des magic quotes !

Oui mais... comment comptez-vous développer avec cette nouvelle version sur votre serveur (ou VM) qui carbure en 5.3 et sert toujours pour les anciens projets ? Bien-sûr vous pouvez toujours faire un nouveau serveur (ou VM) avec la bonne version mais cette solution me laisse un petit goût de pas fini - pas vous ? Ce que je vous propose de voir ici c'est comment installer cette version 5.4 (et possiblement toute autre version de PHP) en parallèle avec votre 5.3 : sur la même machine et avec le même Apache. Tout ça grace aux CGI !

Attention, si vous n'aimez pas un minimum la ligne de commande et l'administration système vous pouvez vous arrêter tout de suite. Ici, on va parler compilation, apt-get, configuration Apache... D'ailleurs, je pars du principe que vous êtes sous Linux (si possible Debian - je suis sur une Ubuntu) et que vous avez déjà un serveur Apache 2 qui tourne avec PHP 5.3 et bien-sûr que vous avez les accès root. Si ce n'est pas votre cas, je vous laisse faire les ajustements nécessaires si besoin.

Compiler PHP 5.4

PHPFarm

Pour nous aider dans cette tâche, nous allons faire appel à PHPFarm. C'est un outil qui permet de facilement récupérer les sources puis compiler PHP avec les options et la version qu'on désire. Vous pouvez soit récupérer la dernière archive soit carrément cloner le repository. Je vous propose de mettre tout ça dans le répertoire php de /usr/local/ :

$ cd /usr/local
$ sudo git clone git://git.code.sf.net/p/phpfarm/code php
$ cd php/src

Configuration

Vous avez maintenant dans ce répertoire le nécessaire pour pouvoir lancer une compilation. Vous pouvez décider quelles options de compilation seront utilisées en créant un fichier custom-options-5.4.5.sh qui sera lu automatiquement si vous compilez pour cette version. Si vous voulez un fichier qui sera utilisé pour toutes les versions 5.4 vous pouvez l'appeler custom-options-5.4.sh. Pour vous aider dans votre quête du Graal, voici ce que contient mon fichier pour la 5.4 :

configoptions="
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-cli \
--with-pear \
--with-openssl=/usr \
--with-iconv \
--with-curl \
--enable-mbstring \
--enable-exif \
--with-zlib \
--with-zlib-dir \
--with-gd \
--with-gettext \
--enable-gd-native-ttf \
--with-mhash \
--enable-ftp \
--with-pspell \
--with-mcrypt \
--enable-bcmath \
--enable-sockets \
--enable-soap \
--enable-calendar \
--with-png-dir=/usr \
--with-jpeg-dir=/usr
"

Compilation

Jusque là, tout devrait se passer sans trop de soucis. Pour compiler rien de plus simple :

$ sudo ./compile.sh 5.4.5

Et là, vous croisez les doigts car il y a 99.99% de chance que vous n'arriviez pas au bout (sondage IPSOS). En fait, le problème est assez simple c'est qu'il vous manque un tas de paquets de développements sur votre serveur tout propre. En général, il stoppera à un moment avec un dernier message sur le paquet en question. Par exemple mcrypt. Dans ce cas-ci, un petit :

$ sudo apt-get install mcr

suivi d'un coup de tabulation pour voir ce qu'il y a de dispo et si vous voyez un paquet qui finit par -dev  ou -devel, installez-le. Il arrive qu'il y ait quelques pièges et des fois il faut tenter un :

$ sudo apt-get install libmcrypt-dev

Un dernier conseil pour la route, pour la librairie pspell c'est :

$ sudo apt-get install libaspell-dev libpspell-dev

Si la partie checking de la compilation est finie et que vous entamez la compilation en elle-même, vous pouvez aller prendre une pause café bien méritée et on se revoit d'ici là.

Ça y est ! Normalement la compilation s'est terminée et vous avez quelques fichiers supplémentaires sur votre disque dur. Rapidement, vous avez les sources dans :

/usr/local/php/src/php-5.4.5

Et surtout les binaires qui nous intéresseront plus tard dans :

/usr/local/php/inst/php-5.4.5/bin

Au tour d'Apache

Le module Fast CGI

Si vous vous souvenez du début de l'article, je vous avais dit que nous allions exécuter notre binaire grâce à CGI. Il nous faut donc installer un module Apache qui s'occupe de ça : FastCGI. Si vous l'avez déjà, passez à la suite. Pour les autres :

$ sudo apt-get install libapache2-mod-fastcgi

Cela fait, nous allons copier le binaire CGI de PHP 5.4 dans un répertoire qui sera plus tard utilisé par Apache et lui donner les droits pour être exécuté :

$ sudo mkdir /usr/lib/cgi-bin
$ cd /usr/lib/cgi-bin
$ sudo cp /usr/local/php/inst/php-5.4.5/bin/php-cgi ./php-cgi-5.4.5
$ sudo chmod 755 php-cgi-5.4.5

Le Virtual Host

J'ai pour habitude de créer une virtual host pour chaque projet sur lequel je travaille. Nous allons donc en créer un ici avec les paramètres qui vont bien pour que lorsqu'un fichier PHP passe, il soit interprêté par le bon binaire PHP qu'on vient de compiler.

$ sudo nano /etc/apache2/sites-available/app54

Puis le remplir avec :

<VirtualHost *:80>
        ServerName app54.dev
        # Une sorte de lien symbolique qui sera accessible à partir du répertoire racine de votre virtual host
        ScriptAlias /cgi-bin /usr/lib/cgi-bin
        # Trucs habituels pour une application de type Zend Framework
        DocumentRoot /var/www/app54/public
        <Directory /var/www/app54/public/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
                # Ici on dit d'utiliser l'Action "php-cgi" pour tous les fichiers *.php
                AddHandler php-cgi .php
                # On définit l'Action en question pour qu'elle utilise notre binaire PHP 5.4
                Action php-cgi /cgi-bin/php-cgi-5.4.5
                # Apparemment il arrive que malgré les directives du dessus l'Action ne soit pas toujours prise en compte donc on le force ici
                <FilesMatch "\.php*">
                        SetHandler php-cgi
                </FilesMatch>
        </Directory>
        # D'autres trucs habituels
        ErrorLog ${APACHE_LOG_DIR}/app54.error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel debug
        CustomLog ${APACHE_LOG_DIR}/app54.access.log combined
</VirtualHost>

Ne pas oublier ensuite de l'activer avec le lien symbolique qui va bien :

$ cd ../sites-enabled/
$ sudo ln -s ../sites-available/app54

Après tout ça, un petit restart d'Apache s'impose :

$ sudo service apache2 restart

Si une erreur à propos de la directive Action apparaît, c'est que vous n'avez pas ce module d'Apache activé. Cette petite ligne devrait vous tirer d'affaire :

$ sudo a2enmod actions

Ça y est, on voit le bout du tunnel ! Normalement tout est en place, il ne vous reste plus qu'à modifier votre fichier hosts pour utiliser notre nouveau virtual host lorsque vous allez sur http://app54.dev . Pour tester que tout fonctionne, un petit phpinfo(); et si la version de PHP qui s'affiche est 5.4.5 c'est +6500XP pour vous et 3 ou 4 level up d'un coup !

Besoin d'un module PHP en 5.4 ?

Vous n'en revenez pas, les larmes vous montent aux yeux, l'émotion est à son comble, mais voilà, votre projet est tellement l33t que vous devez stocker vos données en NoSQL avec MongoDB et lorsque vous faites un joli new Mongo; votre PHP rend l'âme car il ne le trouve pas. Enfer et damnation ! Vous l'aurez deviné, il vous faut le module PHP du même nom, car il n'est pas installé par défaut (je pars du principe que vous avez un serveur Mongo qui tourne bien-sûr).

Malheureusement nous allons devoir passer à nouveau par la compilation, car si vous récupérez le module mongo.so compilé pour la 5.3 et que vous l'utilisez, il y aura un problème d'incompatibilité. En plus, si vous l'installez avec apt-get ou pecl, ça sera bien-sûr la version 5.3 qui sera téléchargée car c'est toujours elle que vous utilisez par défaut.

Les sources peuvent-être trouvées sur GitHub ; soit vous téléchargez le zip dans un coin ou bien clonez le repository où vous voulez.

$ git clone git://github.com/mongodb/mongo-php-driver.git

Ensuite il y a quelques commandes à exécuter que vous pouvez même trouver sur la page GitHub. Petites particularités néanmoins (mais on commence à s'y faire), il ne faut pas oublier qu'on veut ça pour notre PHP 5.4

$ cd mongo-php-driver/
$ /usr/local/php/inst/bin/phpize-5.4.5
$ ./configure --with-php-config="/usr/local/php/inst/bin/php-config-5.4.5"
$ make

Il ne nous reste plus maintenant qu'à copier le module dans un endroit un peu plus habituel, puis à modifier notre php.ini pour l'activer.

$ sudo mkdir /usr/lib/php5/20100525/
$ sudo cp ./modules/mongo.so /usr/lib/php5/20100525/
$ sudo nano /usr/local/php/inst/php-5.4.5/lib/php.ini

Une fois là, trouvez l'endroit où sont les extensions et rajoutez la ligne :

extension=/usr/lib/php5/20100525/mongo.so

Ca y est ! Normalement on est tout bon et il n'est pas nécessaire de relancer Apache. Pour vérifier, là aussi un petit coup de phpinfo(); dans un fichier .php de votre virtual host et si vous y trouvez mongo vous passez direct level 42 !

Félicitations !

Que de chemin parcouru depuis le début de cet article ! J'espère que vous n'aurez rencontré aucun soucis durant les différentes étapes comme j'ai pu en avoir en suivant d'autres tutoriaux en ligne. Si néanmoins vous en avez eu, n'hésitez pas à poser votre question en commentaire, j'essaierai d'y répondre. Pensez à regarder ces quelques liens avant au cas ou :

2 commentaires

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *