¿Cómo tener instaladas dos versiones de PHP y cambiar fácilmente entre ellas?


76

Quiero tener PHP 5.2.17 y PHP 5.3.5 instalados en mi máquina Ubuntu y cambiar según mi necesidad. ¿Cómo puedo conseguir esto?


en ubuntu hay apache.conf en / etc / apache2, también pensé en esto, tal vez en el futuro haga algún paquete que sea muy útil para los desarrolladores web

Puede hacer esto con suPHP, no estoy seguro de los detalles
Marco Ceppi

1
¿Hay algo como Python Virtualenv para tener implementaciones limpias y aisladas de PHP?
lenzai

¿Ha considerado configurar servidores virtuales de Ubuntu utilizando el software de virtualización que usa sin cabeza? Me sorprendería si lo que quieres hacer no está bien servido (sin juego de palabras) por tal configuración.
Simon Hoare

1
Defina lo que significa "cambiar fácilmente". Utilicé esto para el trabajo: mi servidor web estaba usando PHP .phpy .php5archivos diferentes. También puede configurar su servidor WWW para usar diferentes versiones de PHP para diferentes puertos (como http://localhost:80y http://localhost:8080) o diferentes dominios (como http://localphp52y http://localphp53) dejando intacta toda la estructura restante de las carpetas para que pueda comparar fácilmente la ejecución de una aplicación web en dos entornos cambiando el actual URL
cprn

Respuestas:


61

Puede usar un administrador de versiones php para lograr esto. Existen diferentes gestores de versiones disponibles como:

Mi favorito es phpbrew. Espero que esto ayude.


2
Gracias. ¿Pueden incluir instrucciones? (onnu vishadheekarikkamo?)
Tachyons

17
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
Nanne

2
Simplemente revise los enlaces que tienen muy buena documentación en sus sitios. ¿De verdad quieres que copie y pegue cosas de su sitio web?
aneeshep

77
Irónicamente, una de las razones para no solo publicar enlaces es linkrot, por lo que esta publicación ahora sufre.
MirroredFate

@aneeshep, no copiar y pegar su documentación, sino extractos relevantes y algunas líneas sobre lo que es un "administrador de versiones php" y cómo usarlo / configurarlo para ese problema específico sería realmente bienvenido.
Matthieu el

20

Usted puede ejecutar 2 versiones de PHP diferentes a la vez, pero no es tan fácil como apt-conseguirlos. Debe ejecutar una versión instalada por separado y servirla de acuerdo con la configuración de su configuración de apache.

Puedes hacer esto usando fastcgi, por ejemplo: básicamente lo que estás buscando es la configuración que ves en esta página . Agrega un controlador diferente en su configuración según la situación / puerto / dominio que necesita. El truco, después de instalar ambas versiones, es este paso:

=== de esa página ==

  1. El último paso fue crear hosts virtuales. Al final tengo tres archivos en / etc / apache2 / sites-enabled: 000-default, php5.3.17 y php5.4.7 con los siguientes contenidos

defecto:

    <VirtualHost *:80>
      ServerName localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>

php5.3.17:

    <VirtualHost *:80>
      ServerName 5317.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php5317.fcgi
      </Directory>
    </VirtualHost>

php5.4.7:

    <VirtualHost *:80>
      ServerName 547.localhost
      DocumentRoot /var/www
      <Directory "/var/www">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
        AddHandler php-cgi .php
        Action php-cgi /php-fcgi/php547.fcgi
      </Directory>
    </VirtualHost>

Vea para la instalación completa la pregunta vinculada . No olvides mirar los dos enlaces en el encabezado también, se ven como buenos tutoriales (pero menos comprimidos). Esto y eso

(No se preocupe por el hecho de que la pregunta vinculada es una gran pregunta sin respuesta aceptada. El método debería (y funciona) bien, pero el usuario olvidó usarlo <?phpy lo usó <?con etiquetas cortas desactivadas, vea los comentarios)


13

Instalé php 5.6 y 7.0, pero además de todos los consejos, siguió ejecutando 5.6, por lo que este comando ahorra el día (en mi caso, elegí la opción 1 y reinicio apache):

sudo update-alternatives --config php

Es útil recordar el uso phpinfo()y php -vhacer una verificación cruzada ya que ambos pueden tener un valor diferente.
Adi Prasetyo

6

Este funciona para mí: https://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu

Igual que el script de "Growling Flea", pero con nuevas versiones.

Agregar el PPA

Los paquetes PHP 5.6 y PHP 7.0 son de un PPA de terceros, no provistos por los repositorios oficiales de Ubuntu de Canonical. Los PPA que recomiendo aquí son de Ondřej Surý, que empaqueta PHP para Debian (que luego es usado por Ubuntu), así que si bien no es un repositorio oficial, ¡no es exactamente al azar! El PPA en sí está aquí

Para agregar el PPA a su configuración:

sudo add-apt-repository ppa:ondrej/php  

Entonces también queremos obtener información sobre lo que se ofrece en este nuevo PPA, así que ejecute:

sudo apt-get update   

Instalar nuevas versiones de PHP

Ya tenía algunos de los paquetes php5 instalados, pero no desinstalé nada, solo dejé que resolviera lo que quería hacer cuando le pedí que instalara las nuevas versiones:

sudo apt-get install php5.6 php7.0

Esto dio lugar a muchas quejas de apt y muchos conflictos. La primera resolución sugerida fue eliminar todos los paquetes php5 de stock para poder instalar PHP 5.6, así que acepté la primera sugerencia.

Utilizo apache, por lo que esta configuración me dio apache con los módulos php5.6 y php7.0 disponibles, y el módulo php5.6 realmente cargado.

Además del PHP en sí, todas las extensiones y otras herramientas que esperaría con PHP están disponibles para ambas versiones de PHP, por lo que es muy fácil agregar los módulos que necesita. Estaba muy, muy impresionado con lo bien que se hace esto.

Configurar y cambiar versiones

Ahora tiene dos versiones completamente separadas de PHP instaladas en su sistema, así que echemos un vistazo a dónde se fueron todas las piezas.

Todos los archivos de configuración están en /etc/php/5.6y /etc/php/7.0 respectivamente: aquí es donde puede configurar qué extensiones se cargan, establecer la configuración ini y todo lo demás para cada versión de forma aislada.

Soy un usuario de Apache, y como mencioné, ambos módulos están disponibles. Entonces, para cambiar de uno a otro, tengo que hacer:

sudo a2dismod php5.6
sudo a2enmod php7.0
sudo service apache2 restart

Para los usuarios de nginx, los cambios son casi tan fáciles, Digital Ocean tiene buena documentación al respecto (¡tienen excelentes documentos!), Así que consulte su guía: https://www.digitalocean.com/community/tutorials/how-to- upgrade-to-php-7-on-ubuntu-14-04 ya que incluye una sección sobre la configuración de nginx para usar otra versión de PHP.

Desde la línea de comandos, tengo php5.6 y php7.0 disponibles como comandos. También todavía tengo un comando php: busque en / etc / Alternatives para ver que se vincula simbólicamente a una versión particular de PHP cli *. También puede verificar rápidamente cuál está usando el suyo ejecutando php -v.

* más específicamente, ejecute qué php para ver qué versión de PHP se está utilizando, pero esto probablemente apuntará /usr/bin/php, lo que para mí es en sí mismo un enlace simbólico al /etc/alternatives/phpcomando.

Trabajando con extensiones

Este PPA viene con el paquete php-pear habitual que ofrece el comando pecl para ambas versiones de PHP, por lo que cualquier extensión disponible a través de PECL se puede instalar de la manera habitual. También necesitará los encabezados relevantes para instalar php5.6-dev o php7.0-dev.

Cuando finalice la instalación de pecl, recibirá una nota para agregar el archivo * .so a su php.ini; de hecho, lo mejor que puede hacer aquí es mirar lo que está en /etc/php/mods-available. Ya habrá algunos módulos aquí, cada uno en su propio archivo con el nombre de la extensión y terminando en .ini. Puede copiar uno para usarlo como plantilla o crear el suyo propio y poner toda la configuración relevante para la extensión (como mínimo, lo que necesita extension=[extensionName].so).

Una vez que la nueva extensión esté en mods disponibles, habilítela y luego verifíquela haciendo:

sudo phpenmod extension  
php -m  

Esto creará los enlaces simbólicos en los lugares correctos para que su versión actual de PHP cargue este módulo, y debería verlo en la lista de módulos de salida del php -m. Consejo profesional: si no lo ve en la salida, desplácese hasta la parte superior de la salida y vea si hay algún mensaje de error útil allí.


3

Desde esta publicación , acabo de ordenar los comandos y los explico en orden a medida que me sirvieron (Ubuntu 12.04)

Este método te da:

  1. script con menú, que permite cambiar entre las versiones de php instaladas (no ambas al mismo tiempo)

  2. Varias versiones de PHP instaladas en su servidor

  3. archivos conf separados

Instale todas las versiones que necesita (tengo dos)

Instalar dependencias:

sudo apt-get install flex apache2-threaded-dev libxml2-dev apache2 apache2-mpm-prefork apache2-threaded-dev apache2-utils apache2.2-bin apache2.2-common

Instale PHP 5.3 por primera vez. Descargar fuentes php

md5sum Downloads/php-5.3.10.tar.bz2
mkdir ~/Sources
cd ~Sources/
cp -Rf ../Downloads/php-5.3.10.tar.bz2 .
tar xjf php-5.3.10.tar.bz2
cd php-5.3.10/
sudo mkdir /usr/local/php/php_5.3.10

Instale PHP5.6 por primera vez. Descargar fuentes php

md5sum Downloads/php-5.6.11.tar.bz2
mkdir ~/Sources
cd ~Sources/
cp -Rf ../Downloads/php-5.6.11.tar.bz2 .
tar xjf php-5.6.11.tar.bz2
cd php-5.6.11/
sudo mkdir /usr/local/php/php-5.6.11

Script manager versiones PHP: Cree un archivo llamado php.shy póngalo en /bin/:

#!/bin/bash
opcion=0
cat << CABECERAMENU
Opciones del menu
1 => PHP 5.3.10
2 => PHP 5.6.11
CABECERAMENU
echo -n "Ingrese su eleccion: "
read opcion
echo
case $opcion in
    "1")
        rm /etc/apache2/php.conf
        ln -s /usr/local/php/php_5.3.10.conf /etc/apache2/php.conf
        /etc/init.d/apache2 restart
    ;;
    "2")
        rm /etc/apache2/php.conf
        ln -s /usr/local/php/php_5.6.11.conf /etc/apache2/php.conf
        /etc/init.d/apache2 restart
    ;;
    *)
        echo "Opcion no valida"
    ;;
esac

Compila e instala php 5.3:

cd ~/Sources/php-5.3.10/
sudo ./configure --prefix=/usr/local/php/php_5.3.10 --with-config-file-path=/usr/local/php/php_5.3.10/lib --with-mysql --with-libdir=/lib/x86_64-linux-gnu --with-apxs2=/usr/bin/apxs2 --enable-zip --with-gd --with-curl --with-xmlrpc --with-freetype-dir=/usr/lib/x86_64-linux-gnu  --with-jpeg-dir=/usr/lib/x86_64-linux-gnu --with-pdo-mysql --with-pdo-pgsql --enable-soap
sudo make clean
sudo make
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/lib/apache2/modules/libphp5.*
sudo make install
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/local/php/php-5.3.10/modules/libphp5.so
sudo mv /usr/lib/apache2/modules/libphp5.so /usr/local/php/php_5.3.10/modules/
ls -lhart /usr/local/php/php_5.3.10/modules/
sudo a2dismod php5
sudo service apache2 restart

Compila e instala php 5.6

cd ~/Sources/php-5.6.11
sudo ./configure --prefix=/usr/local/php/php_5.6.11 --with-config-file-path=/usr/local/php/php_5.6.11/lib --with-mysql --with-libdir=/lib/x86_64-linux-gnu --with-apxs2=/usr/bin/apxs2 --enable-zip --with-gd --with-curl --with-xmlrpc --enable-calendar --enable-sockets --with-freetype-dir=/usr/lib/x86_64-linux-gnu  --with-jpeg-dir=/usr/lib/x86_64-linux-gnu --with-pdo-mysql  --with-pdo-pgsql --enable-soap
sudo make clean
sudo make
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/lib/apache2/modules/libphp5.*
sudo make install
sudo ls -lhart /usr/lib/apache2/modules/libphp5.*
sudo rm -rf /usr/local/php/php_5.6.11/modules/libphp5.so
sudo mv /usr/lib/apache2/modules/libphp5.so /usr/local/php/php_5.6.11/modules
ls -lhart /usr/local/php/php_5.6.11/modules
sudo a2dismod php5
sudo service apache2 restart

Vamos a usarlos:

$ sudo php.sh
Opciones del menu
1 => PHP 5.3.10
2 => PHP 5.6.11
Ingrese su eleccion: 1

 * Restarting web server apache2                                                                                                                                                                                                                                        apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
 ... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

2

Problemas:

  1. Una sola instancia de apache no puede ejecutar dos versiones diferentes de PHP simultáneamente (al menos hasta donde yo sé).

  2. No se pueden instalar dos versiones diferentes de PHP desde los paquetes, ya que entrarán en conflicto (e intente sobrescribir los mismos directorios).

Solución:

  • para b) Compile "la otra" versión de PHP desde la fuente, manualmente (o si lo prefiere, tome la fuente del paquete apropiado y modifíquelo para evitar conflictos y modificar las rutas de instalación)

  • para a) Crear un conjunto separado de configuraciones para apache con diferentes rutas de módulos y secuencias de comandos de inicio separadas. Y, por supuesto, ejecútelo en un puerto separado.


¿No hay una secuencia de comandos preempaquetada para compilar estas instancias múltiples de PHP en paralelo? ¿Solo para hacerlo manualmente y parchear caminos? Entonces, esto significa que todas las empresas de hosting desarrollan scripts personalizados para ejecutar estas versiones paralelas y nunca comparten su esfuerzo.
lenzai

44
Una sola instancia de apache puede ejecutar 2 versiones de php a la vez.
Nanne

1

En lugar de hacer múltiples VirtualHost, simplemente agrego el siguiente código en mi .htaccessarchivo y sorprendentemente funcionó,

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

Nodo: ya lo había instalado php7.2-fpmantes de usar el código.


0

Si desea ejecutarlos al mismo tiempo, necesita dos puertos diferentes. Tal vez pueda cambiar su configuración de apache (httpd.conf) con un script simple que mueva una u otra versión a la posición correcta antes de comenzar apache.


1
Ya tengo PHP 5.3.5 instalado. ¿Cómo puedo instalar PHP 5.2.17? ¿Podría decirme dónde y qué debo cambiar para cambiar en estas dos versiones? El archivo httpd.conf está vacío en mi instalación.
Debiprasad

0

También puede ejecutar cada sitio web con diferentes usuarios. Más seguro.

Usé este enfoque una vez.

http://blog.servergrove.com/2011/08/22/how-to-setup-multiple-php-versions-on-apache/

Ahora creo que es mejor usar php-fpm ... pero es un poco más complicado configurar múltiples versiones de php.

Tendrá que ejecutar múltiples php-fpms y configurar apache para que se usen entre sí.


3
Bienvenido a Ask Ubuntu! Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
user98085

No tuve tiempo suficiente para hacer lo que dijiste. Supongo que solo quería mostrar un camino. Todavía necesita aprender a usar el material de formateo. ¡Gracias de cualquier manera!
Henrique Fernandes

0

Escribí un script bash que me permite cambiar fácilmente entre las versiones de php instaladas en mi caja. Ejecuto varios hosts virtuales porque tengo varios proyectos web con clientes que tienen programas antiguos y nuevos. Algunos de estos proyectos requieren versiones anteriores de php y otros proyectos requieren php7.0.

Lea mis comentarios y asegúrese de comprender lo que está sucediendo antes de usar esto.

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

0

Tuve el mismo problema cuando manejaba múltiples proyectos. Remití este artículo, pero fue como cada vez que necesito cambiar las versiones si es necesario, pero esto me da la flexibilidad para cli y web por separado.

Pasando de php5.6 a php7.0

Para Apache, podemos usar el comando como:

sudo a2dismod php5.6 ; sudo a2enmod php7.0 ; sudo service apache2 restart

Para CLI, podemos usar el comando como:

sudo update-alternatives --set php /usr/bin/php7.0

Pasando de php7.0 a php5.6

Para Apache, podemos usar el comando como:

sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart

Para CLI, podemos usar el comando como:

sudo update-alternatives --set php /usr/bin/php5.6

Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia. - De la opinión
waltinator

@waltinator Gracias por la revisión, seguro se ocupará de esto
Shivdhwaj Pandey

0

Se puede hacer deshabilitando y habilitando la nueva versión de PHP-

  • cambiar a una versión anterior -
    a2dismod php7.0
    service apache2 restart
  • cambie a la versión más reciente
    a2enmod php7.0
    service apache2 restart
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.