Versions PHP multiples sous Apache

De Adadov.net wiki

Ma dernière galère en date, la gestion de versions multiples de PHP sous Apache ...

J'avais l'habitude d'utiliser mod_php pour mes sites en PHP et d'ajouter suexec pour gérer les cas particuliers nécessitant des droits différents.
Mais malheureusement, ce n'est plus possible ... mod_php n'étant plus vraiment fonctionnel, Fedora a décidé de s'en passer. Et je compte pas me passer de Fedora ...

Donc il ne me restait plus qu'à revoir mon hébergement ... Avec de longues heures d'amusements à la clé !!

Installer de multiples versions de PHP sous Fedora[modifier | modifier le wikicode]

On commence par la première grande question !

Pour installer des versions multiples en parallèle, il fallait déjà trouver les paquets. Mais la chance était de mon côté et Rémi avait fait le travail ! On peut même dire qu'il l'avait très bien fait.

Il ne restait donc plus qu'à installer son dépôt et demander à dnf d'installer les paquets nécessaires.

Bon pour être honnête j'ai beaucoup de mal avec l'arborescence de ses paquets mais on va pas chipoter non plus.

Commençons par installer une première de version supplémentaire, les autres ne seront qu'une variante.
Mon choix se portera sur PHP 5.6, version souvent nécessaire pour héberger des codes qui ne supportent pas encore PHP 7.

J'installe au passage quelques extensions de base.

[root@linux] # dnf install php56-php php56-php-{fpm,cli,mbstring,myslqnd,xml}dblclick to copy

Une fois installée, nous nous retrouvons avec une arborescence dans /opt/remi/php56/ qui contiendra tout le nécessaire pour faire fonctionner cette version de PHP sans gêner le système.

Configurer PHP56-FPM[modifier | modifier le wikicode]

La configuration par défaut de PHP-FPM suffit largement pour le fonctionnement de base.

Si on souhaite une utilisation avancée, il sera facile par la suite de venir ajouter de nouveaux pool pour obtenir une execution de PHP avec des paramètres différents.

La seule modification que nous allons faire, c'est de déplacer le socket d'accès afin qu'il ai un chemin qu'on puisse retenir.
Pour ça nous allons simplement le placer dans le même dossier que le php-fpm du système, avec un nom différent.

Pour le faire il faut modifier la ligne "listen":

listen=/var/run/php-fpm/php56-$pool.sock

$pool permet d'utiliser le nom donné au pool dans le nom du socket. Ainsi si vous copiez ce fichier pour créer un nouveau pool vous ne vous arracherez pas les cheveux pour savoir pourquoi tout déconne ...

Configurer Apache[modifier | modifier le wikicode]

C'est là que la plaisanterie devient la plus amusante ...

Tout d'abord assurez vous de bien avoir installé mod_fcgid sinon ça ne fonctionnera pas avec cette méthode.

Quand vous avez tout bien mis en route du côté de PHP, Apache vient vous rire au nez. Vous aurez probablement pas mal de configuration existantes, sans compter que chaque paquet installé y va de son fichier pour bien vous simplifier la vie (c'est le cas pour une configuration normale ...).

Mais dans notre cas il va falloir faire du ménage ...

Commencez par vous assurer qu'il n'y a plus de mod_php chargé. Allez voir dans les fichiers de chargement des modules et déplacez/supprimez tous ceux qui parlent de mod_php.

Ensuite on va aussi retirer de la configuration (renommez le fichier en ajoutant .0 à la fin suffit) les fichiers des paquets php-fpm.

Une fois le ménage terminé, vos scripts PHP sortent en texte brut quand vous les appelez via Apache. On va pouvoir reprendre la configuration comme on la veut sans avoir un autre fonctionnement qui vient masquer les soucis.

La configuration nécessaire tient simplement en quelques lignes (3 lignes ...). Avec ces lignes, chaque vhost utilisera le PHP-FPM souhaité.

<FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php-fpm/php56-wiki.sock|fcgi://localhost"
</FilesMatch>

Ce SetHandler se compose en 2 parties.
Tout d'abord le chemin vers le socket déclaré un peu plus tôt.
Mais aussi un pipe suivit de fcgi://localhost.
Cette dernière partie va venir spécifier qu'il faut utiliser mod_proxy_fcgid en lui passant l'URI précédente.

Si vous omettez la deuxième partie, Apache vous demandera ce que peut bien être ce scheme unix ...