J'avais la pile PHP, MySQL et Apache installée pour le développement. Cette installation utilise les fichiers de configuration de:
/etc/Apache2/
/etc/php5/
Plus tard, j'ai installé plusieurs versions PHP en utilisant phpbrew
. Toutes les versions sont accessibles et commutables à partir de la CLI. Mais Apache reste toujours sur la version par défaut qui n’a pas été installée avec phpbrew .
Voici une liste de mes versions installées PHP.
$ phpbrew list
Installed versions:
php-5.4.13 (/home/admin1/.phpbrew/php/php-5.4.13)
+default -- --with-bz2=/usr
php-5.5.5 (/home/admin1/.phpbrew/php/php-5.5.5)
php-5.3.27 (/home/admin1/.phpbrew/php/php-5.3.27)
J'ai essayé de changer les chemins des fichiers de configuration pour qu'ils pointent vers PHP de phpbrew. Mais rien ne semble fonctionner.
Comment puis-je dire à Apache d'utiliser la version PHP de phpbrew?
Vous devez créer un PHP avec apxs2
:
1) Assurez-vous d'avoir installé Sudo apt-get install Apache2-dev
.
2) Exécuter phpbrew install 5.4.22 +apxs2=/usr/bin/apxs2
Ensuite, vous devriez voir le fichier de module construit dans votre fichier de configuration Apache.
J'ai écrit ceci, parce que ça m'énervait.
Par défaut, phpbrew switch
changera la version de la CLI. Pour mettre à jour Apache, vous devrez lui dire d'utiliser le fichier .so
nouvellement généré. Sur Ubuntu, ce fichier sera créé comme suit: /usr/lib/Apache2/modules/libphp$VERSION.so
.
Pour que ce fichier .so
soit généré, vous devez installer PHP comme suit:
phpbrew install php-5.6.16 +default +apxs2
Quoi qu'il en soit, voici le script Shell que j'utilise pour changer de version PHP. Le commutateur échouera si le fichier .so
est introuvable et demande les privilèges Sudo
pour redémarrer Apache.
#!/usr/bin/env bash
VERSION=$1
SOFILE=/usr/lib/Apache2/modules/libphp$VERSION.so
CONFFILE5=/etc/Apache2/mods-available/php5.load
CONFFILE7=/etc/Apache2/mods-available/php7.load
source ~/.phpbrew/bashrc
if [ -f $SOFILE ]; then
phpbrew switch $VERSION
phpbrew list
if [[ $VERSION == 7* ]]; then
FILECONTENTS="LoadModule php7_module $SOFILE"
CONFFILE=$CONFFILE7
Sudo a2enmod php7
Sudo a2dismod php5
else
FILECONTENTS="LoadModule php5_module $SOFILE"
CONFFILE=$CONFFILE5
Sudo a2enmod php5
Sudo a2dismod php7
fi;
echo $FILECONTENTS > $CONFFILE
echo "AddType application/x-httpd-php .php" >> $CONFFILE
echo "Updated $CONFFILE"
Sudo service Apache2 restart
else
echo $VERSION "is not configured for Apache"
phpbrew list
fi
Tentative de basculement vers une version PHP non construite pour Apache:
[21:02:55] luker [~]$ phpbrewswitch 5.4.45
5.4.45 is not configured for Apache
php-5.6.16
php-5.6.10
* php-5.5.30
php-5.4.45
Passage réussi à une version PHP contenant un fichier .so
existant:
[21:03:55] luker [~]$ phpbrewswitch 5.6.16
* php-5.6.16
php-5.6.10
php-5.5.30
php-5.4.45
Updated /etc/Apache2/mods-available/php5.load
Examinez la publication Server Fault Comment puis-je dire à Apache quel PHP utiliser?.
Vous devez spécifier la version PHP dans Apache.
Si phpbrew installe avec succès la version php avec + apxs2 ext, vous devriez avoir un nouveau fichier ".so" dans la bibliothèque de modules d'Apache2 (usr/lib/Apache2/modules et non/etc/Apache2/mods-available).
Il devrait y avoir un fichier php5.load ou php7.load créé dans le dossier/etc/Apache2/mods-available qui pointe vers le fichier .so mentionné.
Le fichier .so indiqué dans ces fichiers .load est la version qui est chargée.
Pour basculer entre les versions php5 et php7, utilisez a2enmod/a2dismod php5 php7.
Vous devez recharger Apache2 après avoir modifié la configuration.
Si les fichiers php sont rendus en texte brut, vous devez soit ajouter ceci au fichier php * .load:
Application AddType/x-httpd-php .php
OU pour éviter d'avoir à modifier les fichiers de chargement php à chaque fois que vous installez une nouvelle version, vous pouvez le définir globalement dans votre fichier de configuration Apache2:
SetHandler application/x-httpd-php
Ces instructions sont destinées à un serveur de développement.
Mon script personnel pour cela:
#!/bin/bash
i=1
c=1
options=()
while [ $c -gt 0 ]
do
v=$(phpbrew list | sed -n "${i}p")
if [ -z "$v" ]; then
c=0
Elif [ -n "$v" ]; then
options+=("$v")
fi
i=$[$i+1]
done
count=0
printf "\n"
echo 'Available versions:'
for i in "${options[@]}"
do
echo "$i $[$count+1]"
count=$[$count+1]
done
printf "\n"
echo 'Which version should be enabled?'
read selected
chosen="${options[$selected - 1]}"
chosen="$(echo -e "${chosen}" | tr -d '[:space:]')"
chosen="$(echo -e "${chosen}" | sed 's/\*//g')"
chosen="$(echo -e "${chosen}" | sed 's/php-//g')"
echo -e "php-${chosen} to be enabled."
source $HOME/.phpbrew/bashrc
phpbrew switch php-${chosen}
if [[ $chosen =~ ^5 ]]; then
Sudo a2dismod php7
Sudo a2enmod php5
Sudo service Apache2 reload
Elif [[ $chosen =~ ^7 ]]; then
Sudo a2dismod php5
Sudo a2enmod php7
Sudo service Apache2 reload
else echo 'This script only works on php 5 and 7';
fi
Le script exécute phpbrew list en votre nom et vous permet de sélectionner la version à l'aide des touches numériques. Il lance ensuite phpbrew switch, active ou désactive les modules Apache2 et redémarre le serveur.
La solution que j'ai trouvée pour gérer plusieurs versions PHP avec un serveur Apache consiste à exécuter PHP-FPM et FastCGI au lieu de mod_php
. De cette façon, je peux avoir plusieurs versions de PHP en cours d'exécution et sélectionner les sites de ma machine de développement sur lesquels je veux exécuter quelle version de PHP.
Vous devrez recompiler vos versions PHP avec l'indicateur +fpm
phpbrew au lieu de +apxs2
, les démarrer avec la commande phpbrew fpm start
, installer le paquet Apache libapache2-mod-fastcgi
et probablement désactiver Apache mod_php
- mais c'est plutôt facile une fois que cela fonctionne. Je peux tester le même site avec plusieurs versions de PHP simplement en configurant un hôte virtuel différent pointant vers le même code, mais avec des sockets PHP-FPM différents.
Voici un exemple de fichier de configuration Apache 2.4 /etc/Apache2/mods-enables/fastcgi.conf
avec 2 versions de PHP installées via phpbrew:
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
FastCgiIpcDir /var/lib/Apache2/fastcgi
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 /php5-fcgi
# This is for php 5.6.28
FastCgiExternalServer /usr/lib/cgi-bin/php56-cgi -socket /home/{USERNAME}/.phpbrew/php/php-5.6.28/var/run/php-fpm.sock -pass-header Authorization
# This is for php 7.0.13
FastCgiExternalServer /usr/lib/cgi-bin/php70-cgi -socket /home/{USERNAME}/.phpbrew/php/php-7.0.13/var/run/php-fpm.sock -pass-header Authorization
# this seems to be required by Apache 2.4.10
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
Ensuite, dans la configuration Virtualhost de votre "site" Apache, vous pouvez spécifier la version PHP à exécuter avec un alias comme suit:
<VirtualHost *:80>
# ServerName, ServerAdmin, etc
DocumentRoot /var/www/my-site-code
# Then point the php5-fcgi handler to a specific version of PHP
# Here is PHP7, as defined in the fastcgi.conf file
Alias /php5-fcgi /usr/lib/cgi-bin/php70-cgi
</VirtualHost>