web-dev-qa-db-fra.com

Dire à Apache d’utiliser un PHP version installée avec phpbrew

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?

21
Vinay Aggarwal

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.

34
c9s

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.

/ home/luker/bin/phpbrewswitch

#!/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

Usage

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
21
Luke Rodgers

Examinez la publication Server Fault Comment puis-je dire à Apache quel PHP utiliser?

Vous devez spécifier la version PHP dans Apache.

3
aWebDeveloper

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.

1
OB7DEV

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>
0
thaddeusmt