LINUX:Plusieurs versions de PHP

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche

retour au menu de PHP


But

Une distribution de Linux n'installe qu'une version précise de PHP. Or chaque logiciel Web n'est compatible qu'avec une série réduite de versions non nécessairement compatibles avec celle installée. Il est donc nécessaire de ruser pour contourner cette limitation.

La distribution Fedora est connue pour présenter les dernières versions du Kernel et des logiciels. Lors de l'installation de la version 38 de Fedora, c'est PHP 8.2 qui est présenté alors que sous la version 35 de Fedora, c'était la version 7.4 de PHP. Or de nombreux logiciels Web, installé sur mon serveur, ne sont pas encore compatibles avec cette version ou ont été migrés plus tard. Il en va de même pour les versions intermédiaires: PHP 8.0 et PHP 8.1.

Il fallait donc avoir une double installation des versions 7.4 et 8.2 de PHP.


Installation du dépôt de Remi

En cherchant un peu, on tombe sur les dépôts de Remi qui permettent cette coexistence.

Avant de continuer, il faut s'assurer que la machine est à jour via la commande:

dnf upgrade --refresh

Dès lors on peut installer le dépôt correspondant à notre distribution. Dans notre cas, on est en présence Fedora 35. Voici la commande à adapter selon vos besoins:

dnf install https://rpms.remirepo.net/fedora/remi-release-38.rpm

Enfin nous pouvons rafraichir la liste des logiciels:

dnf upgrade --refresh

La commande suivante permet d'obtenir la liste des logiciels disponibles et en faisant un filtre sur PHP, on obtient ce qui concerne PHP:

dnf list | grep "^php"

En première colonne, on a le nom du logiciel et en seconde sa version. Dans la liste, tout ce qui commence par "php." ou php-" vient avec la distribution; leur version est 8.2. Plus bas, on remarque des entrée commençant par "php" suivi d'un n° faisant référence à la version; ainsi tout ce qui commence par "php74" est lié à la version 7.4. On remarque la présence des modules de la version 5.6 plutôt ancienne mais parfois encore utilisée et des diverses versions de PHP 7.X et de PHP 8.X.


Notons que pour désinstaller le dépôt de Remi, la commande suivante est à exécuter:

dnf remove remi-release


Installation de PHP version 7.4

Maintenant installons PHP version 7.4 avec les commandes suivantes:

dnf install php74
dnf install php74-php
dnf install php74-php-fpm

Elles comprennent aussi l'intégration avec Apache.

Ensuite installons quelques modules de base qui nous sont nécessaires:

dnf install php74-php-gd
dnf install php74-php-mysqlnd
dnf install php74-php-pecl-zip
dnf install php74-php-intl

La commande pour PHP version 7.4:

php74 --modules

et la commande pour PHP de la distribution:

php --modules

permettent de comparer la présence des modules présents de part et d'autre. A votre charge d'ajouter les modules nécessaires.

Les commandes équivalentes:

php74 -v

et

php -v

permettent de comparer leur version.


Localisation et configuration des PHP

Comme vous l'avez remarqué, en ligne de commande, l'appel:

php

fait appel à PHP version 8.2 et

php74

fait appel à PHP version 7.4. Ceci est important car certains traitements de maintenance nécessitent d'y faire appel dans des scripts.

Ces deux exécutables se retrouvent dans le répertoire "/bin".

Les fichiers de configuration de PHP version 8.2, venant avec la distribution, se retrouvent dans les répertoires "/etc" et en dessous.

Par contre, tout ce qui concerne PHP version 7.4 se retrouve dans le répertoire "/etc/opt/remi/php74". Le reste, les exécutables et librairies se trouvent eux sous le répertoire "/opt/remi/php74/root/usr". Adaptez le fichier de configuration de base "/etc/opt/remi/php74/php.ini" pour la version 7.4 comme vous l'avez fait pour le fichier "/etc/php.ini" dédié à la version 8.2.


Apache

Nous utilisons Apache.

Le service dédié à Apache se nomme "httpd.service". Il est activé avec la commande:

systemctl enable httpd.service

et son démarrage, son arrêt ou son redémarrage se fait avec les commandes respectives suivantes:

Systemctl start httpd.service
Systemctl stop httpd.service
Systemctl restart httpd.service


Ses fichiers de configuration se situent sous le répertoire "/etc/httpd".

Pour qu'Apache puisse utiliser le PHP, il doit pouvoir utiliser une application ou un module tiers de type CGI. Sous Fedora 35, par défaut, le protocole utilisé est le FastCGI. Chaque requête sous forme d'un script PHP est transmis à un autre service PHP-FPM. Pour y arriver, le module "proxy_fcgi_module" doit être activé. On peut le vérifier avec la commande suivante qui est un extrait des modules chargés par Apache:

httpd -M | grep fcgi

Pour optimiser ces traitements, Apache intègre un serveur MPM (Multi-Processing Modules) dont la fonctionnalité "event" est activée. On peut vérifier que le module correspondant "mpm_event_module" est bien chargé avec la commande suivante:

httpd -M | grep event

On peut aussi le vérifier avec la commande suivante:

httpd -V

qui donne:

Server version: Apache/2.4.52 (Fedora Linux)
Architecture:   64-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
  forked:       yes (variable process count)

L'activation des modules se retrouve dans les fichiers de configuration situés dans le répertoire "/etc/httpd/conf.modules.d".


Enfin il faudra définir le lancement de l'application tierce. Mais selon le site visité, il faut pouvoir choisir la version de PHP adaptée, compatible avec ce site.


Le fichier texte de configuration d'Apache de démarrage se nomme "/etc/httpd/conf/httpd.conf". Vers la fin de ce fichier, on remarque par défaut, la ligne:

IncludeOptional conf.d/*.conf

Cette ligne vous renseigne que tous les fichiers de type ".conf" du répertoire "/etc/httpd/conf.d" seront chargés. C'est là que l'on place un fichier de configuration par site. Par exemple si on a installé le logiciel Web WordPress, un fichier wordpress.conf s'y retrouve.

Mais on y retrouve également des fichiers reprenant des directives plus générales liés à un volet spécifique. Deux de ces fichiers nous concernent en relation avec PHP: "php.conf" pour la version 8.2 et "php74-php.conf" pour la version 7.4. C'est là qu'il faut intervenir. Si on ne veut que la version de PHP 7.4, on ne garde que le fichier "php74-php.conf" et on élimine l'autre et inversement. Mais plus souvent, nous avons un mixte et ces deux fichiers ne peuvent coexister tels quels.

Quand on compare les deux fichiers, beaucoup de lignes sont communes ou semblables. Remarquons au passage que l'appel CGI intégré à PHP dans Apache (mod_phpX.c) n'est pas activé car nous utilisons PHP-FPM; nous laisserons près de la moitié de ces fichiers de côté.

La partie cruciale à intégrer à chaque site sont les lignes:

dans le fichier "php.conf" pour PHP version 8.2

SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"

dans le fichier "php74-php.conf" pour PHP version 7.4

SetHandler "proxy:unix:/var/opt/remi/php74/run/php-fpm/www.sock|fcgi://localhost"


On met de côté ces deux fichiers pour qu'ils ne s'activent pas. On crée un autre fichier que j'ai nommé "php-commun.conf" mais peu importe son nom pour autant que son extension soit ".conf". Son contenu est le suivant si on élimine les commentaires:


 <Files ".user.ini">
    Require all denied
 </Files>
 AddType text/html .php
 DirectoryIndex index.php
 <IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
   <IfModule !mod_php.c>
     SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
   </IfModule>
  </IfModule>
 </IfModule>

(note: les options "IfModule" sont superflues.)

En parallèle, on crée deux fichiers, un pour chaque version de PHP qui seront intégrés spécifiquement dans la configuration des sites qui utilisent le PHP. Ils n'auront pas l'extension ".conf" car ils ne doivent pas être chargés globalement.

Un premier fichier se nommera "php82.cfg" pour la version 8.2:


 <IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
   <IfModule !mod_php.c>
    <FilesMatch \.(php|phar)$>
        SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
    </FilesMatch>
   </IfModule>
  </IfModule>
 </IfModule>

Le second fichier se nommera "php74.cfg" pour la version 7.4:


 <IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
    <IfModule !mod_php.c>
     <FilesMatch \.(php|phar)$>
        SetHandler "proxy:unix:/var/opt/remi/php74/run/php-fpm/www.sock|fcgi://localhost"
     </FilesMatch>
    </IfModule>
  </IfModule>
 </IfModule>


Enfin on intègre dans chaque fichier de configuration des sites utilisant PHP, un appel au fichier désiré. Cet appel se fait entre les balises <Directory ...> et </Directory>.

Pour faire appel à PHP version 8.2, on ajoute la ligne:

 IncludeOptional conf.d/php82.cfg

et

 IncludeOptional conf.d/php74.cfg

pour PHP version 7.4.


On peut tester la syntaxe de cette nouvelle configuration avec la commande suivante:

httpd -t

Dès que la configuration est finie, on relance Apache comme vu plus haut. On remarque par la même occasion que deux services liés à nos deux versions de PHP sont lancés automatiquement: php-fpm.service pour PHP version 8.2 et php74-php-fpm.service pour PHP version 7.4. Ces deux services sont arrêtés en même temps qu'Apache.


Organisation personnelle

Au cours du temps, il y a des mises à jour régulières et un fichier éliminé est remis en place.

Pour contourner ce problème et pour une question d'organisation et de lisibilité, j'ai créé un répertoire "/etc/httpd/conf.commun.d" dans lequel j'ai mis les fichiers reprenant les directives générales que je veux garder.

A côté, j'ai créé un répertoire par nom de domaine. Par exemple pour le domaine "home.dom", j'ai créé un répertoire "/etc/httpd/conf.home.dom.d". On y met tous les fichiers de configuration des sites concernés. Le découpage peut être différent selon votre convenance.

Enfin dans le fichier "/etc/httpd/conf/httpd.conf", la ligne:

IncludeOptional conf.d/*.conf

doit être remplacée par ces deux nouvelles:

IncludeOptional conf.commun.d/*.conf
IncludeOptional conf.home.dom.d/*.conf

De temps à autre après des mises à jour, on vérifie à son aise les nouveaux fichiers de configuration et on adapte les siens si nécessaire.

On adapte également les appels aux deux fichiers "php82.cfg" et "php74.cfg" selon leur emplacement.

Cette configuration est pratique car si on a des certificats de sécurité qui sont différents par domaine, on peut facilement organiser ces "virtual host" avec leurs certificats respectifs en englobant la ligne liée à un nom de domaine entre les balises <VirtualHost ...> et </VirtualHost>.


Journaux

Les journaux de PHP version 7.4 lors de l'exécution des scripts au travers du service "php74-php-fpm", se situent dans le répertoire "/var/opt/remi/php74/log/php-fpm". Ceux de PHP version 8.2, venant avec la distribution, se trouvent dans le répertoire traditionnel "/var/log/php-fpm". Ce dernier point a son importance car lorsqu'on utilisera PHP 7.4 via le serveur Web, il faudra aller voir les messages d'erreur dans ce premier répertoire.


Installation de PHP versions 8.0 et 8.1

J'ai inévitablement eu le même problème avec les versions de PHP 8.0 et 8.1.

Il suffit d'effectuer les mêmes opérations faites pour la version 7.4 de PHP ci-dessus que l'on applique à ces autres versions. On change les "74" par des "80" ou "81" selon la version souhaitée. Notons que le nom des modules complémentaires peuvent changer en fonction des versions.






retour au menu de PHP