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?
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?
Respuestas:
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.
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í:
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
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
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
yum install gcc libxml2-devel bzip2-devel zlib-devel \
curl-devel libmcrypt-devel libjpeg-devel \
libpng-devel gd-devel mysql-devel
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
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.
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.
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.
Listen 80
y Listen 81
en cada uno ifdefine
, respectivamente.
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.
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í.
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
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
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.ini
archivos 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