¿Cómo se pueden ejecutar múltiples versiones de PHP 5.x en un servidor LAMP de desarrollo?

81

Necesito probar mis aplicaciones PHP con múltiples versiones de PHP 5.x, como PHP 5.0.0 y PHP 5.2.8.

¿Existe alguna forma de configurar un servidor LAMP de desarrollo para poder probar rápidamente aplicaciones con múltiples versiones de PHP5?

James Mishra
fuente
Debería poder usar una variable PATH, pero no estoy al 100%, así que no
respondo
Cómo usar múltiples versiones de PHP (PHP-FPM y FastCGI) con ISPConfig 3 (Ubuntu 12.10) - @ hek2mgl: Las preguntas sobre herramientas de desarrollo no están fuera de tema.
Hakre
@hakre De acuerdo, usar FPM haría menos probable que múltiples versiones se afecten entre sí cuando se carguen como un módulo de Apache :)
Ja͢ck
@Jack: Argh, no módulo Apache, FCGI;)
hakre
Hasta ahora he probado phpbrew y php-version pero ambos parecen fallar al compilar PHP.
buen culo

Respuestas:

17

Una forma de hacer esto es tener su versión principal de php configurada con mod_php y ejecutar todas las demás a través de cgi rápido en diferentes puertos (es decir, 81, 82, 83, etc.). Sin embargo, esto no garantizará un comportamiento totalmente consistente.

Dana la cuerda
fuente
32
Una idea: para PHP 5.2.1, use el puerto 10521. Para 5.0.0, use 10500 :)
Wayne
2
Otra opción sería ejecutarlo usando CGI (o FastCGI) en diferentes rutas, es decir, / cgi500 /, / cgi528 /, ...
Gray Panther
En caso de que esté en Debian y quiera usar empaquetado, le recomiendo usar debootstrap para crear un sistema chroot que contenga su versión de PHP, luego configure Apache dentro del sistema chroot'ed.
Max Tsepkov
23

Con CentOS, puede hacerlo usando una combinación de fastcgi para una versión de PHP y php-fpm para la otra, como se describe aquí:

https://web.archive.org/web/20130707085630/http://linuxplayer.org/2011/05/intall-multiple-version-of-php-on-one-server

Basado en CentOS 5.6, solo para Apache

1. Habilite el repositorio rpmforge y epel yum

wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
sudo rpm -ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
sudo rpm -ivh epel-release-5-4.noarch.rpm

2. Instale php-5.1

La serie CentOS / RHEL 5.x tiene php-5.1 en la caja, simplemente instálelo con yum, por ejemplo:

sudo yum install php php-mysql php-mbstring php-mcrypt

3. Compile e instale php 5.2 y 5.3 desde la fuente

Para php 5.2 y 5.3, podemos encontrar muchos paquetes rpm en Internet. Sin embargo, todos entran en conflicto con el php que viene con CentOS, así que será mejor que los construyamos e instalemos desde soure, esto no es difícil, el punto es instalar php en una ubicación diferente.

Sin embargo, cuando instalamos php como un módulo de apache, solo podemos usar una versión de php al mismo tiempo. Si necesitamos ejecutar una versión diferente de php en el mismo servidor, al mismo tiempo, por ejemplo, un host virtual diferente puede necesitar una versión diferente de php. Afortunadamente, los geniales FastCGI y PHP-FPM pueden ayudar.

Compile e instale php-5.2 con fastcgi habilitado

1) Instale los paquetes de desarrollo necesarios

yum install gcc libxml2-devel bzip2-devel zlib-devel \
    curl-devel libmcrypt-devel libjpeg-devel \
    libpng-devel gd-devel mysql-devel

2) Compilar e instalar

wget http://cn.php.net/get/php-5.2.17.tar.bz2/from/this/mirror
tar -xjf php-5.2.17.tar.bz2
cd php-5.2.17
./configure --prefix=/usr/local/php52 \
    --with-config-file-path=/etc/php52 \
    --with-config-file-scan-dir=/etc/php52/php.d \
    --with-libdir=lib64 \
    --with-mysql \
    --with-mysqli \
    --enable-fastcgi \
    --enable-force-cgi-redirect \
    --enable-mbstring \
    --disable-debug \
    --disable-rpath \
    --with-bz2 \
    --with-curl \
    --with-gettext \
    --with-iconv \
    --with-openssl \
    --with-gd \
    --with-mcrypt \
    --with-pcre-regex \
    --with-zlib
make -j4 > /dev/null
sudo make install
sudo mkdir /etc/php52
sudo cp php.ini-recommended /etc/php52/php.ini

3) crea un script de envoltura fastcgi

crear archivo /usr/local/php52/bin/fcgiwrapper.sh

#!/bin/bash
PHP_FCGI_MAX_REQUESTS=10000
export PHP_FCGI_MAX_REQUESTS
exec /usr/local/php52/bin/php-cgi
chmod a+x /usr/local/php52/bin/fcgiwrapper.sh
Build and install php-5.3 with fpm enabled

wget http://cn.php.net/get/php-5.3.6.tar.bz2/from/this/mirror
tar -xjf php-5.3.6.tar.bz2 
cd php-5.3.6
./configure --prefix=/usr/local/php53 \
    --with-config-file-path=/etc/php53 \
    --with-config-file-scan-dir=/etc/php53/php.d \
    --enable-fpm \
    --with-fpm-user=apache \
    --with-fpm-group=apache \
    --with-libdir=lib64 \
    --with-mysql \
    --with-mysqli \
    --enable-mbstring \
    --disable-debug \
    --disable-rpath \
    --with-bz2 \
    --with-curl \
    --with-gettext \
    --with-iconv \
    --with-openssl \
    --with-gd \
    --with-mcrypt \
    --with-pcre-regex \
    --with-zlib 

make -j4 && sudo make install
sudo mkdir /etc/php53
sudo cp php.ini-production /etc/php53/php.ini

sed -i -e 's#php_fpm_CONF=\${prefix}/etc/php-fpm.conf#php_fpm_CONF=/etc/php53/php-fpm.conf#' \
    sapi/fpm/init.d.php-fpm
sudo cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
sudo chmod a+x /etc/init.d/php-fpm
sudo /sbin/chkconfig --add php-fpm
sudo /sbin/chkconfig php-fpm on

sudo cp sapi/fpm/php-fpm.conf /etc/php53/

Configurar php-fpm

Edite /etc/php53/php-fpm.conf, cambie algunas configuraciones. Este paso es principalmente para descomentar algunas configuraciones, puede ajustar el valor si lo desea.

pid = run/php-fpm.pid
listen = 127.0.0.1:9000
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

Entonces, comience fpm

sudo /etc/init.d/php-fpm start

Instalar y configurar mod_fastcgi, mod_fcgid

sudo yum install libtool httpd-devel apr-devel
wget http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
tar -xzf mod_fastcgi-current.tar.gz
cd mod_fastcgi-2.4.6
cp Makefile.AP2 Makefile
sudo make top_dir=/usr/lib64/httpd/ install
sudo sh -c "echo 'LoadModule fastcgi_module modules/mod_fastcgi.so' > /etc/httpd/conf.d/mod_fastcgi.conf"
yum install mod_fcgid

Configurar y probar hosts virtuales

1) Agregue la siguiente línea a / etc / hosts

127.0.0.1 web1.example.com web2.example.com web3.example.com

2) Cree la raíz del documento web y coloque un index.php debajo para mostrar el cambio phpinfo a la raíz del usuario, ejecute

mkdir /var/www/fcgi-bin
for i in {1..3}; do
    web_root=/var/www/web$i
    mkdir $web_root
    echo "<?php phpinfo(); ?>" > $web_root/index.php
done

Nota: Se requiere el directorio vacío / var / www / fcgi-bin, NO LO QUITE MÁS TARDE

3) Cree el archivo de configuración de Apache (adjúntelo a httpd.conf)

NameVirtualHost *:80

# module settings
# mod_fcgid
<IfModule mod_fcgid.c>
        idletimeout 3600
        processlifetime 7200
        maxprocesscount 17
        maxrequestsperprocess 16
        ipcconnecttimeout 60 
        ipccommtimeout 90
</IfModule>
# mod_fastcgi with php-fpm
<IfModule mod_fastcgi.c>
        FastCgiExternalServer /var/www/fcgi-bin/php-fpm -host 127.0.0.1:9000
</IfModule>


# virtual hosts...

#################################################################
#1st virtual host, use mod_php, run php-5.1
#################################################################
<VirtualHost *:80>
        ServerName web1.example.com
        DocumentRoot "/var/www/web1"

        <ifmodule mod_php5.c>
                <FilesMatch \.php$>
                        AddHandler php5-script .php
                </FilesMatch>
        </IfModule>

        <Directory "/var/www/web1">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>
#################################################################
#2nd virtual host, use mod_fcgid, run php-5.2
#################################################################
<VirtualHost *:80>
        ServerName web2.example.com
        DocumentRoot "/var/www/web2"

        <IfModule mod_fcgid.c>
                AddHandler fcgid-script .php
                FCGIWrapper /usr/local/php52/bin/fcgiwrapper.sh
        </IfModule>

        <Directory "/var/www/web2">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks +ExecCGI
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>
#################################################################
#3rd virtual host, use mod_fastcgi + php-fpm, run php-5.3
#################################################################
<VirtualHost *:80>
        ServerName web3.example.com
        DocumentRoot "/var/www/web3"


        <IfModule mod_fastcgi.c>
                ScriptAlias /fcgi-bin/ /var/www/fcgi-bin/
                AddHandler php5-fastcgi .php
                Action php5-fastcgi /fcgi-bin/php-fpm
        </IfModule>

        <Directory "/var/www/web3">
                DirectoryIndex index.php index.html index.htm
                Options -Indexes FollowSymLinks +ExecCGI
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>

4) reinicia Apache. visite los 3 sitios respetuosamente para ver phpinfo y validar el resultado. es decir:

http://web1.example.com
http://web2.example.com
http://web3.example.com

Si todo está bien, puede usar uno de los 3 hosts virtuales como plantilla para crear un nuevo host virtual, con la versión de php deseada.

tntu
fuente
1
Sin embargo, esta es una respuesta de enlace único. Incluya los detalles relevantes en la respuesta en lugar de confiar completamente en el otro sitio. Los enlaces tienen el molesto problema de que pueden desaparecer y, de esta manera, SO aún no contiene la información relevante.
Maarten Bodewes
Es posible que desee buscar en CloudLinux. Es una solución de pago, pero tiene un precio aceptable.
transilvlad
1
¡Respuesta correcta! Aquí está la misma solución para Ubuntu: howtoforge.com/…
Tobias Gaertner
10

Tener varias instancias de apache + php nunca me gustó mucho, pero probablemente sea la forma más fácil de hacerlo. Si no te apetece KISS ... aquí tienes una idea.

Ponga su apache en funcionamiento e intente configurarlo como debian y ubuntu, por ejemplo, tenga directorios para los módulos cargados. Su configuración de apache puede usar líneas como esta:

Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

Luego construya su primera versión de php y asígnele un prefijo que tenga el número de versión contenido explícitamente, por ejemplo, /usr/local/php/5.2.8, /usr/local/php/5.2.6 ...

El conf / load se vería así:

php5.2.6.load

LoadModule php5_module /usr/local/php/5.2.6/libphp5.so

php5.2.8.load

LoadModule php5_module /usr/local/php/5.2.8/libphp5.so

Para cambiar de versión, todo lo que tiene que hacer es cambiar los archivos de carga y configuración del directorio que apache incluye para los de otra versión. Puede automatizar eso con un simple script bash (elimine el archivo real, copie el archivo de versiones alternativas en su lugar y reinicie Apache.

Una ventaja de esta configuración es que todo es constante, siempre que mantenga php.ini igual en términos de opciones y módulos (lo que tendría que hacer con CGI de todos modos). Todos están pasando por SAPI. Sus aplicaciones no necesitarán ningún cambio en absoluto, ni necesitarán usar URL relativas.

Creo que esto debería funcionar, pero, de nuevo, no lo he probado ni es probable que lo haga, ya que no tengo los mismos requisitos que tú. Sin embargo, comente si alguna vez lo intenta.

Leprechaun
fuente
8

Nota: El siguiente método funcionará en Windows.

Un método alternativo (si está bien ejecutar una única versión de PHP a la vez) es definir varios servicios de Apache, cada uno de los cuales utilizará una versión de PHP diferente.

En primer lugar, condiciones de uso en el archivo de configuración de Apache:

 <ifdefine php54>
    SetEnv PHPRC C:/apache/php54/
    ScriptAlias /php/ "C:/apache/php54/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"
</ifdefine>

<ifdefine php55>
    SetEnv PHPRC C:/apache/php55/
    ScriptAlias /php/ "C:/apache/php55/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"
</ifdefine>

Ahora, usando httpd.exe, cree dos servicios separados desde la línea de comando (elevado a administrador):

httpd.exe -k install -n Apache224_php54 -D php54

httpd.exe -k install -n Apache224_php55 -D php55

Ahora puede iniciar uno de los servicios anteriores a la vez (debe apagar uno antes de iniciar el otro).

Si ha instalado anteriormente Apache como servicio, puede eliminarlo usando el siguiente comando (reemplace el nombre del servicio con el que ha usado):

apache -k uninstall -n Apache224

Una nota más es que yo personalmente uso un "programa de icono de área de notificación" llamado "Seobiseu" para iniciar y detener los servicios según sea necesario. Le he agregado los dos servicios anteriores.

wmac
fuente
En realidad, es una solución muy inteligente. Si desea ejecutar varios servicios en paralelo, puede incluir Listen 80y Listen 81en cada uno ifdefine, respectivamente.
caiosm1005
Buena idea, pero la pregunta es sobre un servidor LAMP, no un servidor WAMP.
Vinicius Monteiro
4

Entendiendo que probablemente está hablando de una máquina local / de escritorio y probablemente le gustaría seguir hablando de una máquina local / de escritorio, le ofreceré una alternativa en caso de que pueda ayudarlo a usted oa alguien más:

Configure múltiples instancias de servidor virtual en la nube y comparta su código entre ellas como un repositorio de git (o mercurial, supongo, aunque no tengo experiencia personal, todo lo que realmente necesita es algo descentralizado). Esto tiene la ventaja de brindarle una experiencia de producción lo más cercana posible, y si tiene experiencia en la configuración de servidores, entonces no es tan complicado (o costoso, si solo desea poner en marcha un servidor, haga lo que tenga que hacer, luego gírelo hacia abajo nuevamente, entonces está hablando de unos pocos centavos para decir 50 centavos, hasta unos pocos dólares si simplemente lo deja funcionando).

Hago todo el desarrollo de mi proyecto en la nube en estos días y me ha resultado mucho más sencillo administrar la infraestructura de lo que nunca lo hice al usar instalaciones locales / no virtualizadas, y hace que este tipo de escenario en paralelo sea bastante sencillo. Solo quería lanzar la idea si no la hubieras considerado.

Jason
fuente
3

Acabo de degradar con éxito de PHP5.3 en Ubuntu 10.

Para hacer esto utilicé el siguiente script:

#! /bin/sh
php_packages=`dpkg -l | grep php | awk '{print $2}'`

sudo apt-get remove $php_packages

sed s/lucid/karmic/g /etc/apt/sources.list | sudo tee /etc/apt/sources.list.d/karmic.list

sudo mkdir -p /etc/apt/preferences.d/

for package in $php_packages;
do echo "Package: $package
Pin: release a=karmic
Pin-Priority: 991
" | sudo tee -a /etc/apt/preferences.d/php
done

sudo apt-get update

sudo apt-get install $php_packages

Para cualquiera que no sepa cómo ejecutar scripts desde la línea de comandos, aquí hay un breve tutorial:

1. cd ~/
2. mkdir bin
3. sudo nano ~/bin/myscriptname.sh
4. paste in the script code I have posted above this
5. ctrl+x (this exits and prompts for you to save)
6. chmod u+x myscriptname.sh

Estos 6 pasos crean un script en una carpeta llamada "bin" en su directorio personal. A continuación, puede ejecutar este script llamando al siguiente comando:

~/bin/myscriptname.sh

¡Oulia!

¡Espero que esto ayude a alguno de ustedes!

Como referencia, aquí es donde obtuve el guión: PHP5.2.10 para Ubuntu 10

Hay varias personas allí confirmando que esto funciona, y funcionó de maravilla para mí.

Tisch
fuente
buen guión, aunque karmic no funcionó para mí porque estaba en Power PC. Solo usé el script para eliminar mi instalación actual y luego construí manualmente 2.14
Jason
2

Rasmus Lerdorf, quien creó PHP, mantiene una solución Vagrant activa que parece resolver sus necesidades. Permite cambiar rápidamente entre versiones de PHP, que actualmente admite más de 20 versiones diferentes. Viene de fábrica con un servidor nginx, pero se puede cambiar fácilmente a apache2 con una configuración preconfigurada. También es compatible con MySQL listo para usar.

De esta manera tendrá acceso a todas las versiones de PHP, desplegables en dos de los servidores web principales, en una bonita caja vagabunda, mantenida por el gran hombre detrás de PHP.

Para obtener más información, me gustaría referirme a la charla del sr. Lerdorf en https://youtu.be/6XnysJAyThs?t=2864

El repositorio de github que contiene la solución Vagrant se encuentra en https://github.com/rlerdorf/php7dev

Figidon
fuente
Esta es probablemente, en mi humilde opinión, la 'mejor' respuesta: una máquina virtual diferente para cada versión (pero ¿puede ejecutar varias versiones en una dirección IP?). Pero qué irónico que el creador de php deba hacer esto: el mayor defecto de php debe ser la falta de compatibilidad entre versiones, lo que hace que Joomla, por ejemplo, sea casi inútil.
EML
0

Tengo varios proyectos en ejecución en mi caja. Si ya ha instalado más de una versión, este script bash debería ayudarle a cambiar fácilmente. En este momento tengo php5, php5.6 y php7.0, que a menudo cambio de un lado a otro dependiendo del proyecto en el que estoy trabajando. Aquí está mi código.

Siéntete libre de copiar. Asegúrese de comprender cómo funciona el código. Esto es para webhostin. mi caja local mis mods se almacenan en / etc / apache2 / mods-enabled /

    #!/bin/bash
# This file is for switching php versions.  
# To run this file you must use bash, not sh
# 
    # OS: Ubuntu 14.04 but should work on any linux
# Example: bash phpswitch.sh 7.0
# Written by Daniel Pflieger
# growlingflea at g mail dot com

NEWVERSION=$1  #this is the git directory target

#get the active php enabled mod by getting the array of files and store
#it to a variable
VAR=$(ls /etc/apache2/mods-enabled/php*)

#parse the returned variables and get the version of php that is active.
IFS=' ' read -r -a array <<< "$VAR"
array[0]=${array[0]#*php}
array[0]=${array[0]%.conf}


#confirm that the newversion veriable isn't empty.. if it is tell user 
#current version and exit
if [ "$NEWVERSION" = "" ]; then
echo current version is ${array[0]}.  To change version please use argument
exit 1
fi 

OLDVERSION=${array[0]}
#confirm to the user this is what they want to do
echo "Update php"  ${OLDVERSION} to ${NEWVERSION}


#give the user the opportunity to use CTRL-C to exit ot just hit return
read x

#call a2dismod function: this deactivate the current php version
sudo a2dismod php${OLDVERSION}

#call the a2enmod version.  This enables the new mode
sudo a2enmod php${NEWVERSION} 

echo "Restart service??"
read x

#restart apache
sudo service apache2 restart
Pulga gruñona
fuente
0

Para las pruebas, simplemente ejecuto varias instancias de httpd en diferentes direcciones IP, por lo que tengo php7 ejecutándose en 192.168.0.70 y php5.6 ejecutándose en 192.168.0.56. En producción, tengo un sitio que ejecuta un antiguo oscommerce con php5.3 y solo tengo un archivo de configuración diferente para el sitio

httpd -f /etc/apache2/php70.conf
httpd -f /etc/apache2/php53.conf

También es una forma limpia de tener diferentes php.iniarchivos para diferentes sitios. Si solo tiene un par de sitios, es una buena manera de mantener las cosas organizadas y no tiene que preocuparse por más de un sitio a la vez cuando actualiza algo

Danial
fuente