Compiler une extension PHP peut parfois être pratique, parfois nécessaire. Dans notre cas en interne nous voulions tester Gearman, un outil de « pool request », c’est à dire de queues. Nous voulions pouvoir l’utiliser avec PHP et le choix de l’extension PHP nous paraissait le plus logique, le plus fiable et le plus rapide.
Nous avons chez netinfluence pour habitude de travailler en local sur des Mac avec MAMP (en parallèle de Zend Server) et en production sur des serveurs Debian, et donc nous souhaitions compiler l’extension Gearman de PHP sur MAMP. Hors ce n’est pas aussi simple qu’il n’y paraît…
1) Installer Homebrew
Homebrew, c’est d’après ses auteurs « the missing package manager for OS X ». Équivalent d’un « apt-get » sur une Debian, c’est un outil particulièrement pratique. Vous pouvez sauter cette étape si Homebrew c’est déjà installé sur votre machine.
Pour installer Homebrew, il suffit d’exécuter la commande suivante :
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
Puis on teste son installation :
brew -v
2) Installer autoconf
C’est une étape nécessaire, heureusement c’est très simple à réaliser avec Homebrew :
brew install autoconf
3) Télécharger les sources de PHP
MAMP est livré avec plusieurs versions de PHP. La première chose à faire est de décider sur quelle version on va vouloir compiler notre extension. Nous allons compiler avec la dernière version disponible à la date de cet article et gérée par MAMP, à savoir PHP 5.5.10.
On va la chercher ici : http://ch1.php.net/get/php-5.5.10.tar.gz/from/a/mirror
On l’extrait, on renomme le dossier en php et on le colle à l’emplacement suivant :
/Applications/MAMP/bin/php/php5.5.10/include/
4) Configurer les sources PHP
Étape très simple mais indispensable sans quoi « php-config » ne sera par exemple pas disponible, on le fait grâce aux commandes suivantes :
cd /Applications/MAMP/bin/php/php5.5.10/include/php/ ./configure
5) Préparer l’environnement de compilation
Cela se fait avec la commande phpize mais il faut bien penser à le faire avec le binaire fourni avec la version de PHP qui est inclue dans MAMP sans quoi le système le fera avec la version de PHP livrée par défaut, ce qu’on ne veut absolument pas.
Plus d’infos sur phpize : http://php.net/manual/fr/install.pecl.phpize.php
On retourne donc dans le dossier de notre extension avec cd puis on exécute la commande suivante :
/Applications/MAMP/bin/php/php5.5.10/bin/phpize
6) Configuration et compilation de l’extension
Une fois l’environnement de compilation préparé, il ne nous reste qu’à compiler. Pour cela on lance les commandes suivantes :
./configure --with-php-config=/Applications/MAMP/bin/php/php5.5.10/bin/php-config make sudo make install
Si tout va bien, la compilation s’exécute et génère un fichier gearman.so (dans mon cas) situé dans le répertoire « modules » de notre extension.
7) Copie de l’extension dans MAMP
L’étape suivante est de copier le fichier généré dans le répertoire des extensions de notre version de PHP sur MAMP.
Chez nous, il se trouve à cet endroit :
/Applications/MAMP/bin/php/php5.5.10/lib/php/extensions/no-debug-non-zts-20121212/
Ce dossier contient déjà d’autres extensions comme opcache.so, pdo_mysql.so, etc.
8) Activation de l’extension Gearman sur MAMP
On doit ensuite simplement ajouter l’appel à l’extension dans le php.ini de notre version de PHP.
Pour notre version de PHP, il s’agit du fichier :
/Applications/MAMP/bin/php/php5.5.10/conf/php.ini
On ajoute notre extension à la suite de celles déjà définies dans le fichier. Chez nous c’est ligne 541 :
extension=gearman.so
On ferme le fichier et on s’apprête à relancer Apache pour que les modifications soient prises en compte.
9) Redémarrage de MAMP et vérification de l’installation
Pour être sûr que l’extension a bien été installée et chargée correctement, on lance la console PHP via le menu de MAMP :
Journal > PHP
Puis on redémarre Apache. On a pas d’erreur, c’est un bonne nouvelle ! On teste quand même l’installation de l’extension avec l’affichage de PHPInfo dans un fichier :
<?php phpinfo(); ?>
Et voilà le résultat :
Notre extension est maintenant utilisable avec PHP !