multiple - ubuntu 16.04 change php version
Dígale a Apache que use una versión específica de PHP instalada usando phpbrew (5)
Escribí esto, porque me estaba molestando.
Por defecto, el phpbrew switch
cambiará la versión de la CLI. Para actualizar Apache, deberá indicarle que use el archivo .so
recién generado. En Ubuntu, este archivo se creará como /usr/lib/apache2/modules/libphp$VERSION.so
.
Para que se genere este archivo .so
, debe instalar PHP como:
phpbrew install php-5.6.16 +default +apxs2
De todos modos, aquí está el script de shell que uso para cambiar las versiones de PHP. El conmutador fallará si no se encuentra el archivo .so
y solicitará privilegios de sudo
para reiniciar 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
Uso
Intentando cambiar a una versión de PHP que no fue construida para 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
Cambio exitoso a una versión de PHP que tiene un archivo .so
existente:
[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
Tenía el PHP, MySQL y la pila de Apache instalados para el desarrollo. Esa instalación está utilizando archivos de configuración de:
/etc/apache2/
/etc/php5/
Más tarde instalé múltiples versiones de PHP usando phpbrew
. Todas las versiones son accesibles y conmutables desde CLI. Pero Apache siempre permanece en la versión predeterminada que no se instaló usando phpbrew .
Aquí hay una lista de mis versiones de PHP instaladas.
$ 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)
He intentado cambiar las rutas de los archivos de configuración para que apunten al PHP de phpbrew. Pero nada parece estar funcionando.
¿Cómo puedo decirle a Apache que use la versión PHP de phpbrew?
La solución que encontré para administrar varias versiones de PHP con un servidor Apache es ejecutar PHP-FPM y FastCGI en lugar de mod_php
. De esta manera puedo tener varias versiones de PHP en ejecución, y seleccionar qué sitios de mi máquina de desarrollo quiero ejecutar en qué versión de PHP.
Necesitará volver a compilar sus versiones de PHP con el indicador de phpbrew de +fpm
lugar de +apxs2
, iniciarlos con el comando de phpbrew fpm start
, instalar el libapache2-mod-fastcgi
Apache libapache2-mod-fastcgi
, y probablemente deshabilitar apache mod_php
- pero es bastante hábil una vez que está trabajando. Puedo probar el mismo sitio con varias versiones de PHP simplemente configurando un host virtual diferente que apunta al mismo código, pero diferentes sockets de PHP-FPM.
Aquí hay un ejemplo de un archivo de configuración Apache 2.4 /etc/apache2/mods-enables/fastcgi.conf
con 2 versiones de PHP instaladas a través de 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>
Luego, en la configuración de Virtualhost de su "sitio" de apache, puede especificar qué versión de PHP se ejecutará con un Alias así:
<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>
Mire la publicación de Fallas del servidor ¿Cómo le digo a Apache qué PHP usar? .
Necesitas especificar la versión de PHP en Apache.
Necesitas construir un PHP con apxs2
:
1) Asegúrese de haber instalado sudo apt-get install apache2-dev
.
2) Ejecute phpbrew install 5.4.22 +apxs2=/usr/bin/apxs2
Entonces debería ver el archivo de módulo construido en su archivo de configuración de Apache.
Si phpbrew instala con éxito la versión php con + apxs2 ext, debería tener un nuevo archivo ".so" dentro de la biblioteca de módulos de apache2 (usr / lib / apache2 / modules no / etc / apache2 / mods-available).
Debería haber un php5.load o php7.load creado dentro de la carpeta / etc / apache2 / mods-available que apunta al archivo .so mencionado.
El archivo .so que figura en esos archivos .load es la versión que se carga.
Para cambiar entre una versión php5 y php7 use a2enmod / a2dismod php5 php7.
Necesitas recargar apache2 después de cambiar la configuración.
Si los archivos php se están mostrando como texto sin formato, debe agregar esto al archivo php * .load:
Aplicación AddType / x-httpd-php .php
O para evitar tener que editar los archivos de carga php cada vez que instale una nueva versión, puede configurar esto globalmente en su archivo de configuración apache2:
Aplicación SetHandler / x-httpd-php
Estas instrucciones están destinadas a un servidor de desarrollo.
Mi guión personal para esto:
#!/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
El script ejecuta phpbrew list en su nombre y le permite seleccionar la versión con las teclas numéricas. A continuación, ejecuta el conmutador phpbrew y también activa o desactiva los módulos apache2 y reinicia el servidor.