Come si può eseguire più versioni di PHP 5.x su un server LAMP di sviluppo?

StackOverflow https://stackoverflow.com/questions/524508

  •  22-08-2019
  •  | 
  •  

Domanda

ho bisogno di testare le mie applicazioni PHP con più versioni di PHP 5.x, come PHP 5.0.0 e PHP 5.2.8.

C'è un modo che io possa configurare un server LAMP di sviluppo in modo da poter testare rapidamente applicazioni con più versioni di PHP5?

È stato utile?

Soluzione

Un modo per farlo è quello di avere la versione principale del PHP impostato con mod_php ed eseguire tutti gli altri attraverso CGI veloce su porte diverse (vale a dire 81, 82, 83, ecc). Questo non garantisce un comportamento del tutto coerente però.

Altri suggerimenti

Con CentOS, è possibile farlo utilizzando una combinazione di FastCGI per una versione di PHP, e php-FPM per l'altro, come descritto qui:

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

Sulla base di CentOS 5.6, per Apache solo

1. Abilita RPMForge e EPEL yum repository

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. Installare php-5.1

serie CentOS / RHEL 5.x hanno php-5.1 in scatola, è sufficiente installarlo con yum, ad esempio:

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

3. Compilare e installare PHP 5.2 e 5.3 dai sorgenti

per PHP 5.2 e 5.3, possiamo trovare molti pacchetti rpm su Internet. Tuttavia, tutti conflitto con il php che viene fornito con CentOS, così, faremmo meglio compilazione ed installazione da Soure, questo non è difficile, il punto è quello di installare php in posizione diversa.

Tuttavia, quando installare PHP come modulo di Apache, siamo in grado di utilizzare solo una versione di PHP, allo stesso tempo. Se abbiamo bisogno di eseguire la versione diversa del php sullo stesso server, allo stesso tempo, per esempio, host virtuale diverso può essere necessario diversa versione di PHP. Fortunatamente, il FastCGI fresco e PHP-FPM può aiutare.

Costruire e installare php-5.2 con FastCGI attivato

1) Installare pacchetti dev richiesti

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

2) Compilare e installare

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) creare uno script FastCGI involucro

creare il file /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/

configue php-fpm

Modifica /etc/php53/php-fpm.conf, modificare alcune impostazioni. Questo passaggio è principalmente quello di rimuovere il commento alcune impostazioni, è possibile regolare il valore, se volete.

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

Quindi, avviare fpm

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

Installazione e configurazione 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

Impostazione e collaudo host virtuali

1) Aggiungere la seguente riga al file / etc / hosts

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

2) Creare radice del documento web e rilasciare un index.php sotto di essa per mostrare phpinfo passare root eseguire

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: È necessario il / directory fcgi-bidone vuoto / var / www, NON rimuoverlo in seguito

3) Creare file di configurazione di Apache (aggiungere al 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) apache restart. visitare i 3 siti posti rispettivamente per visualizzare phpinfo e convalidare il risultato. vale a dire:

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

Se tutto OK, è possibile utilizzare uno dei 3 host virtuale come template per creare nuovo host virtuale, con la versione di PHP desiderato.

La presenza di più istanze di apache + php mai solleticato la mia fantasia, ma probabilmente il modo più semplice per farlo. Se non avete voglia di un bacio ... ecco un'idea.

Ottieni il tuo apache installato e funzionante, e provare a fare configurarlo come Debian e Ubuntu farlo, ad esempio, si potrebbe avere directory per i moduli caricati. Il vostro conf apache può utilizzare le linee in questo modo:

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

Poi costruire la prima versione di PHP, e dargli un prefisso che ha il numero di versione in modo esplicito contenuto, ad esempio, /usr/local/php/5.2.8, /usr/local/php/5.2.6 ...

Il conf / carico sarebbe simile a questa:

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

Per passare versioni, tutto quello che dovete fare è cambiare il carico e file conf dalla Apache Directory non la comprendono avanti per quelli per un'altra versione. È possibile automatizzare che con un semplice script bash (eliminare il file vero e proprio, copiare il file delle versioni alternative a posto, e riavviare apache.

Un vantaggio di questa configurazione è il tutto è consitent, così a lungo si mantiene il php.ini è lo stesso in termini di opzioni e moduli (che si avrebbe a che fare con CGI comunque). Sono tutti passando SAPI. Le applicazioni non avranno bisogno di alcuna modifica di sorta, né bisogno di usare URL relativi.

I pensare questo dovrebbe funzionare, ma poi di nuovo, non ho provato, né sono in grado di farlo come io non ho gli stessi requisiti di voi. Non commento se mai provi però.

. Nota: Il seguente metodo funziona su Windows

Un metodo alternativo (se è ok per eseguire una singola versione di PHP alla volta) è quello di definire più servizi Apache, ognuno dei quali utilizzeranno una versione di PHP diversa.

Prima di tutto le condizioni d'uso nel file di configurazione di 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>

Ora con il httpd.exe creare due servizi separati da linea di comando (elevata all'amministratore):

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

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

Ora è possibile avviare uno dei servizi di cui sopra in un momento (dovrebbe arresto uno prima di iniziare l'altra).

Se avete precedentemente installato Apache come servizio è possibile rimuovere che l'uso al di sotto di comando (sostituire il nome del servizio con quello che avete utilizzato):

apache -k uninstall -n Apache224

Un altro nota è che io personalmente uso un "programma di icona dell'area di notifica" chiamato "Seobiseu" per avviare e interrompere i servizi in base alle esigenze. Ho aggiunto i due servizi di cui sopra ad esso.

La comprensione che probabilmente stai parlando di una macchina locale / desktop e probabilmente vuole Continua parlando di una macchina / desktop locale, mi butto in alternativa là fuori per voi nel caso in cui potrebbe aiutare voi o qualcun altro:

Impostare più istanze di server virtuali nella nuvola, e condividere il codice tra loro come un repository git (o mercuriale, suppongo, anche se non ho esperienza personale tutti si ha realmente bisogno è qualcosa decentrata). Questo ha il vantaggio di dare voi più vicino ad un'esperienza di produzione il più possibile, e se si dispone di impostare l'esperienza dei server, allora non è così complicato (o costoso, se si desidera solo per girare un server su, fai quello che devi fare, poi girare giù di nuovo, allora si sta parlando di pochi centesimi fino a dire 50 centesimi, fino a un paio di dollari se solo lasciarlo in esecuzione).

Lo faccio tutto il mio sviluppo del progetto nella nuvola in questi giorni e ho trovato molto più semplice per gestire l'infrastruttura di quanto io abbia mai fatto quando si usano le installazioni locali / non virtualizzato, e rende questa sorta di side-by- scenario lato abbastanza semplice. Volevo solo buttare l'idea là fuori, se non avesse ritenuto.

Ho appena declassato con successo da PHP5.3 su Ubuntu 10.

Per fare questo ho usato il seguente 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

Per tutti coloro che non sa come eseguire gli script dalla riga di comando, ecco 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

Queste 6 fasi creare uno script in una cartella denominata "bin" nella vostra home directory. È quindi possibile eseguire questo script chiamando il seguente comando:

~/bin/myscriptname.sh

Oulia!

Spero che questo aiuti alcuni di voi!

Per avere un riferimento, qui è dove ho avuto il copione: PHP5.2.10 per Ubuntu 10

Ci sono diverse persone in là tutto a conferma che questo funziona, e ha funzionato un piacere per me.

Rasmus Lerdorf, che ha creato PHP, è mantenere una soluzione Vagrant attivo che sembra risolvere le vostre esigenze. Permette di passare rapidamente tra versioni PHP, sostenendo più di 20 versioni differenti. Si esce dalla scatola con un server nginx, ma può essere facilmente commutato apache2 con un ambiente preconfigurato. Supporta anche MySQL out of the box.

In questo modo si avrà accesso a tutte le versioni di PHP, implementabile su due dei principali server web, in una bella scatola vagabonda, gestito dal grande uomo dietro PHP.

Per ulteriori informazioni Vorrei fare riferimento al discorso tenuto da mr. Lerdorf a https://youtu.be/6XnysJAyThs?t=2864

Il repository github contenente la soluzione Vagrant si trova a https://github.com/rlerdorf/php7dev

Ho diversi progetti in corso sulla mia macchina. Se avete già installato più di una versione, questo script bash dovrebbe aiutare a passare facilmente. Al momento ho PHP5, php5.6 e php7.0 che spesso swtich avanti e indietro a seconda del progetto cui sto lavorando. Ecco il mio codice.

Sentitevi liberi di copiare. Assicurati di capire come funziona il codice. Questo è per il webhostin. la mia casella locale miei mods sono memorizzati in / 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

Per la prova ho semplicemente eseguire più istanze di httpd su diversi indirizzi IP, quindi devo php7 esecuzione su 192.168.0.70 e 192.168.0.56 php5.6 in esecuzione su. Nella produzione Ho un sito in esecuzione un vecchio oscommerce esecuzione PHP5.3 e ho solo un file di configurazione diversa per il sito

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

E 'anche un modo pulito per avere diversi file php.ini per siti diversi. Se v'è solo un paio di siti, se un bel modo per mantenere le cose organizzate e non si deve preoccupare di più di 1 sito in un momento in cui si aggiorna qualcosa

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top