Dans des contextes spécifiques, il est peut-être nécessaire d’installer de vieilles versions de PHP sur un système d’exploitation plus récent. Sur ce tutoriel, je vais vous montrer comment installer PHP 5.4 sous Debian 11.
Installer une vieille version d’une application sur un système d’exploitation récent est un vrai parcours du combattant quand aucun paquetage prêt à l’emploi n’est disponible pour cette version spécifique d’OS et d’application. Entre version de dépendances incompatibles et indisponibilité d’anciennes librairies sur le dépôt officiel de la distribution, cela revient quasiment à recompiler presque tout un système d’exploitation.
Heureusement, aujourd’hui, je vous montre ma recette personnelle pour installer PHP 5.4 sous Debian 11. D’ailleurs, ce tutoriel est pleinement compatible avec le panneau de contrôle ISPConfig, si vous souhaitez l’utiliser sur un serveur muni de ce panneau de contrôle.
1. Installer OpenSSL 1.0.2u
OpenSSL 1.0.2u est la version d’OpenSSL la plus récente avec lequel j’ai pu faire fonctionner PHP 5.4. Evidemment, celui qui est embarqué par défaut sur Debian 11 ne correspond pas à cette version. Notre mission sera alors d’installer OpenSSL 1.0.2u à côté.
Préparer le dossier qui va accueillir OpenSSL 1.0.2u (vous vous doutez bien que nous n’allons pas le mettre directement dans les dossiers systèmes, sous risque qu’il entre en conflit avec celui déjà disponible sur Debian 11) :
mkdir -p /usr/local/openssl-1.0.2u
Télécharger la bonne version et le décompresser :
wget -O /usr/local/src/openssl-1.0.2u.tar.gz https://www.openssl.org/source/openssl-1.0.2u.tar.gz
cd /usr/local/src/
tar -xf openssl-1.0.2u.tar.gz
rm -f openssl-1.0.2u.tar.gz
cd openssl-1.0.2u
Evidemment, j’essaie d’être très économe au point de supprimer l’archive téléchargée, devenu inutile, après décompression. 😁
Il est maintenant temps de configurer et installer OpenSSL 1.0.2u :
./config shared --prefix=/usr/local/openssl-1.0.2u
make -j $(nproc)
make install
Remarquez la présence du -j $(nproc)
qui me permet de compiler rapidement le code source en utilisant plusieurs workers (ici, le nombre de worker est équivalent au nombre de CPU retrouvé par la commande nproc
).
Une fois installé, il faut mettre à disposition les librairies et mettre en place le bundle des certificats d’autorité racine :
ln -s /usr/local/openssl-1.0.2u/lib /usr/local/openssl-1.0.2u/lib/x86_64-linux-gnu
wget -O /usr/local/openssl-1.0.2u/ssl/cert.pem "http://curl.haxx.se/ca/cacert.pem"
ln -s /usr/local/openssl-1.0.2u/lib/libcrypto.so.1.0.0 /usr/lib/x86_64-linux-gnu/
ln -s /usr/local/openssl-1.0.2u/lib/libssl.so.1.0.0 /usr/lib/x86_64-linux-gnu/
Et voilà, nous pourrions le réutiliser plus tard.
2. Compiler cURL
Même chose pour cURL, je n’ai pas pu faire fonctionner la version de cURL disponible de base sur Debian 11 avec PHP 5.4. J’ai dû recompiler une vieille version dans le même principe que j’ai fait pour OpenSSL.
Préparer le dossier qui va accueillir cURL 7.82.0 :
mkdir -p /usr/local/curl-7.82.0
Télécharger et décompresser cURL 7.82.0 :
wget -O /usr/local/src/curl-7.82.0.tar.gz https://curl.se/download/curl-7.82.0.tar.gz
cd /usr/local/src/
tar -xf curl-7.82.0.tar.gz
rm -f curl-7.82.0.tar.gz
cd curl-7.82.0
Compiler et installer cURL :
./configure --with-openssl=/usr/local/openssl-1.0.2u --prefix=/usr/local/curl-7.82.0
make -j $(nproc)
make install
Pour une fois, je n’ai pas besoin de faire des liens symboliques, je configurerai PHP plus tard pour qu’il cherche automatiquement cURL dans le dossier que j’ai créé pour.
3. Compiler et installer PHP 5.4 sous Debian 11
On arrive enfin sur le cœur du sujet. Commençons par télécharger PHP 5.4 :
wget -O /usr/local/src/php-5.4.45.tar.gz https://www.php.net/distributions/php-5.4.45.tar.gz
cd /usr/local/src/
tar -xf php-5.4.45.tar.gz
rm -f php-5.4.45.tar.gz
cd php-5.4.45
Vient ensuite la configuration avant la compilation. C’est notamment ici qu’on mets les liens vers les librairies précédemment compilés et qu’on active des extensions :
./configure --prefix=/usr/local/php-5.4 --with-pdo-pgsql --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr --enable-soap --enable-calendar --with-curl=/usr/local/curl-7.82.0 --with-mcrypt --with-zlib --with-pgsql --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif --enable-bcmath --with-mhash --enable-zip --with-pcre-regex --with-pdo-mysql --with-mysqli --with-mysql-sock=/var/run/mysqld/mysqld.sock --with-jpeg-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf --with-openssl=/usr/local/openssl-1.0.2u --with-fpm-user=www-data --with-fpm-group=www-data --with-libdir=/lib/x86_64-linux-gnu --enable-ftp --with-kerberos --with-gettext --with-xmlrpc --with-xsl --enable-fpm
J’utilise l’option --prefix
pour indiquer où PHP 5.4 doit être installé par la suite. Il est possible que l’environnement sur lequel j’ai testé cette installation contient déjà des pré-requis à la compilation. Si la configuration échoue, relevez juste le message d’erreur et essayez de voir sur Stackoverflow ou packages.debian.org le paquetage qui y est lié, et essayez de l’installer. Par exemple, --with-pdo-mysql
va sûrement avoir besoin de libmariadb-dev
si vous utilisez MariaDB.
Une fois la configuration faite, vous pouvez procéder à la compilation et l’installation :
make -j $(nproc)
make install
4. Configuration de PHP 5.4
Vous vous en doutez, l’installation n’est qu’une partie de l’équation. Il faut maintenant configurer. Commençons par créer les fichiers de configurations grâce aux templates fournis :
cp /usr/local/src/php-5.4.45/php.ini-production /usr/local/php-5.4/lib/php.ini
cp /usr/local/php-5.4/etc/php-fpm.conf.default /usr/local/php-5.4/etc/php-fpm.conf
Préparons un dossier pour placer les pool PHP-FPM :
mkdir -p /usr/local/php-5.4/etc/php-fpm.d
Maintenant, il faut :
Mettre à jour le chemin du fichier PID :
sed -i "s|;pid\s=\s*run/php-fpm.pid|pid = run/php-fpm.pid|g" /usr/local/php-5.4/etc/php-fpm.conf
Placer le fichier de socket :
sed -i "s|;*listen\s*=.*|listen = /run/php/php5.4-fpm.sock|g" /usr/local/php-5.4/etc/php-fpm.conf
Mettre l’utilisateur Apache (www-data) comme propriétaire du socket :
sed -i "s|;*listen.owner\s*=.*|listen.owner = www-data|g" /usr/local/php-5.4/etc/php-fpm.conf
sed -i "s|;*listen.group\s*=.*|listen.group = www-data|g" /usr/local/php-5.4/etc/php-fpm.conf
Inclure les pools PHP-FPM dans le dossier précédemment créé :
sed -i "s|;*include\s*=.*|include=/usr/local/php-5.4/etc/php-fpm.d/*.conf|g" /usr/local/php-5.4/etc/php-fpm.conf
Il s’agit maintenant de créer le service systemd qui va gérer le processus PHP-FPM :
cat <<EOF > /lib/systemd/system/php-5.4-fpm.service
[Unit]
Description=The PHP 5.4 FastCGI Process Manager
After=network.target
[Service]
Type=simple
PIDFile=/usr/local/php-5.4/var/run/php-fpm.pid
ExecStartPre=/bin/mkdir -p /run/php
ExecStart=/usr/local/php-5.4/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php-5.4/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PermissionsStartOnly=true
[Install]
WantedBy=multi-user.target
EOF
Un rechargement des services sur systemd, puis l’activation au démarrage du service et enfin son premier démarrage :
systemctl daemon-reload
systemctl enable --now php-5.4-fpm.service
systemctl restart php-5.4-fpm.service
Par pure intérêt cosmétique et expérience utilisateur, je mets toujours un symlink vers /usr/bin
de sorte à ce que l’utilisateur final (qui sera peut-être un développeur peu expérimenté) aura juste à taper « php5.4
» dans son terminal pour accéder à PHP 5.4, au lieu de /usr/local/php-5.4/bin/php
. J’en fais de même pour php-cgi
, bien que je me demande si vraiment un humain serait amené à utiliser php-cgi dans un terminal.
ln -s /usr/local/php-5.4/bin/php /usr/bin/php5.4
ln -s /usr/local/php-5.4/bin/php-cgi /usr/bin/php-cgi5.4
5. Ajouter PHP 5.4 dans ISPConfig
Si vous utilisez ce panneau de contrôle en particulier, la commande suivante vous permettra d’ajouter PHP 5.4 dans la liste des versions PHP disponibles sur l’interface (en utilisant le mode d’intégration PHP-FPM ou FastCGI) :
mysql --defaults-file=/etc/mysql/debian.cnf dbispconfig -e "INSERT INTO server_php (sys_userid, sys_groupid, sys_perm_user, sys_perm_group, sys_perm_other, server_id, client_id, name, php_fastcgi_binary, php_fastcgi_ini_dir, php_fpm_init_script, php_fpm_ini_dir, php_fpm_pool_dir, active) VALUES (1, 1, 'ruid', 'ruid', '', 1, 0, 'PHP 5.4', 'php-cgi5.4', '/usr/local/php-5.4/lib/php.ini', 'php-5.4-fpm', '/usr/local/php-5.4/lib/php.ini', '/usr/local/php-5.4/etc/php-fpm.d', 'y')"
Cette requête SQL ne fonctionne que dans un contexte où ISPConfig n’est pas en multi-cluster (multiple serveur). MySQL grapille évidemment les informations de connexion dans le fichier /etc/mysql/debian.cnf
.
Conclusion
La compilation de PHP 5.4 sur Debian 11 est compliquée mais pas impossible. Elle est toutefois nécessaire dans des contextes où vos sites web et/ou applications ont encore besoin d’une vieille version de PHP, notamment des gros usines à gaz que vous avez conçus depuis plus d’une dizaine d’années.
Je recommande toutefois de migrer aussi vite que possible vers la dernière version maintenue de PHP, voire même vers la dernière version disponible, pour prendre de l’avance.
Grâce aux frameworks PHP (tel que Laravel), vous pouvez aujourd’hui créer des applications et sites PHP en toute simplicité et qui peut durer dans l’âge : souvent un simple mise à jour du framework permet de palier les problèmes d’incompatibilités avec les nouvelles versions de PHP. N’hésitez pas à miser dessus si vous comptez réécrire vos vieux applications PHP 5.4 un jour ou l’autre.