web-dev-qa-db-fra.com

Comment peut-on exécuter plusieurs versions de PHP 5.x sur un serveur de développement LAMP?

Je dois tester mes applications PHP avec plusieurs versions de PHP 5.x, telles que PHP 5.0.0 et PHP 5.2.8.

Existe-t-il un moyen de configurer un serveur de développement LAMP pour pouvoir tester rapidement des applications avec plusieurs versions de PHP5?

81
James Mishra

Une façon de faire est d’avoir votre version principale de php configurée avec mod_php et d’exécuter toutes les autres via fast cgi sur différents ports (81, 82, 83, etc.). Cela ne garantit cependant pas un comportement totalement cohérent.

17
Dana the Sane

Avec CentOS, vous pouvez le faire en combinant fastcgi pour une version de PHP et php-fpm pour l’autre, comme décrit ici:

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

Basé sur CentOS 5.6, pour Apache uniquement

1. Activer le référentiel rpmforge et 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. Installez php-5.1

Les séries CentOS/RHEL 5.x ont php-5.1 en boîte, il suffit de l'installer avec yum, par exemple:

Sudo yum install php php-mysql php-mbstring php-mcrypt

3. Compiler et installer php 5.2 et 5.3 à partir de la source

Pour PHP 5.2 et 5.3, nous pouvons trouver de nombreux paquets rpm sur Internet. Cependant, ils sont tous en conflit avec le php fourni avec CentOS, aussi nous ferions mieux de les construire et de les installer à partir de Soure, ce n’est pas difficile, il s’agit d’installer Php à un emplacement différent. 

Cependant, lors de l'installation de php en tant que module Apache, nous ne pouvons utiliser qu'une seule version de php à la fois. Si nous devons exécuter différentes versions de php sur le même serveur, plusieurs hôtes virtuels peuvent avoir besoin d'une version différente de php au même moment. Heureusement, les systèmes FastCGI et PHP-FPM peuvent vous aider.

Construire et installer php-5.2 avec fastcgi activé

1) Installer les packages de développement requis

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

2) Compiler et installer

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) créer un script d'emballage fastcgi

créer le fichier /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

Éditez /etc/php53/php-fpm.conf, modifiez certains paramètres. Cette étape consiste principalement à décommenter certains paramètres, vous pouvez ajuster la valeur si vous le souhaitez.

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

Ensuite, lancez fpm

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

Installer et configurer 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

Configuration et test des hôtes virtuels

1) Ajoutez la ligne suivante à/etc/hosts

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

2) Créez la racine du document Web et déposez un index.php dessous pour afficher phpinfo Passer à l'utilisateur root, exécutez

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

Remarque: le répertoire/var/www/fcgi-bin vide est requis, NE L'ENLEVER PAS PLUS TARD}

3) Créer un fichier de configuration Apache (ajouter à 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) redémarrez Apache. visitez les 3 sites avec respect pour voir phpinfo et valider le résultat. c'est à dire:

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

Si tout va bien, vous pouvez utiliser l'un des 3 hôtes virtuels comme modèle pour créer un nouvel hôte virtuel, avec la version php souhaitée.

23
transilvlad

Avoir plusieurs instances d'Apache + php n'a jamais vraiment séduit mon imagination, mais c'est probablement le moyen le plus simple de le faire. Si vous ne vous sentez pas comme KISS ... voici une idée.

Mettez votre Apache en service et essayez de le configurer comme le font Debian et Ubuntu, par exemple, créez des répertoires pour les modules chargés. Votre conf Apache peut utiliser des lignes comme celle-ci:

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

Ensuite, construisez votre première version de php, et donnez-lui un préfixe dont le numéro de version est explicitement contenu, par exemple, /usr/local/php/5.2.8, /usr/local/php/5.2.6 ...

La conf/load ressemblerait à quelque chose comme ceci:

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

Pour changer de version, il suffit de modifier les fichiers de chargement et de configuration à partir du répertoire qu'Apache inclut pour ceux d'une autre version. Vous pouvez automatiser cela avec un simple script bash (supprimer le fichier réel, copier le fichier de versions alternatives à la place et redémarrer Apache.

Un des avantages de cette configuration est que tout est cohérent, aussi longtemps que vous gardez le même php.ini en termes d’options et de modules (que vous auriez quand même à faire avec CGI). Ils passent tous par SAPI. Vos applications n’auront besoin d’aucune modification, ni d’utilisation d’URL relatives.

Je pense que cela devrait fonctionner, mais encore une fois, je ne l'ai pas essayé et je ne le ferai probablement pas car je n'ai pas les mêmes exigences que vous. Faites des commentaires si vous avez déjà essayé.

10
Leprechaun

Remarque: La méthode suivante fonctionnera sous Windows.

Une autre méthode (si vous pouvez exécuter une version unique de PHP à la fois) consiste à définir plusieurs services Apache, chacun utilisant une version PHP différente.

Tout d’abord, utilisez les conditions du fichier de configuration 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>

Maintenant, en utilisant httpd.exe, créez deux services distincts à partir de la ligne de commande (élevée en tant qu'administrateur):

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

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

Maintenant, vous pouvez démarrer l'un des services ci-dessus à la fois (vous devez en fermer un avant de démarrer l'autre).

Si vous avez déjà installé Apache en tant que service, vous pouvez le supprimer en utilisant la commande ci-dessous (remplacez le nom du service par celui que vous avez utilisé):

Apache -k uninstall -n Apache224

Une autre remarque est que j’utilise personnellement un "programme d’icône de zone de notification" appelé "Seobiseu" pour démarrer et arrêter les services selon les besoins. J'ai ajouté les deux services ci-dessus.

8
wmac

Comprenant que vous parlez probablement d'une machine locale/de bureau et que vous aimeriez probablement continuer parler d'une machine locale/de bureau, je vais vous proposer une alternative au cas où cela pourrait vous aider ou aider quelqu'un autre:

Configurez plusieurs instances de serveur virtuel dans le cloud et partagez votre code entre elles en tant que référentiel git (ou Mercurial, je suppose, même si je n'ai aucune expérience personnelle, tout ce dont vous avez besoin est décentralisé). Cela présente l'avantage de vous donner une expérience de production aussi proche que possible. Si vous avez de l'expérience dans la configuration de serveurs, ce n'est pas si compliqué (ou coûteux, si vous voulez simplement faire tourner un serveur, faites ce que vous devez faire, puis réduisez-le à nouveau, puis vous parlez de quelques cents jusqu’à 50 cents, jusqu’à quelques dollars si vous le laissez fonctionner).

En ce moment, je suis entièrement responsable du développement de mes projets dans le cloud et j’ai trouvé que la gestion de l’infrastructure était beaucoup plus simple que lors de l’installation d’installations locales/non virtualisées. simple. Je voulais juste lancer l'idée si vous n'y aviez pas pensé.

4
Jason

Je viens de passer avec succès de PHP 5.3 sur Ubuntu 10.

Pour ce faire, j'ai utilisé le script suivant: 

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

Pour ceux qui ne savent pas comment exécuter des scripts à partir de la ligne de commande, voici un bref tutoriel:

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

Ces 6 étapes créent un script dans un dossier appelé "bin" dans votre répertoire personnel. Vous pouvez ensuite exécuter ce script en appelant la commande suivante: 

~/bin/myscriptname.sh

Oulia!

J'espère que cela aide certains d'entre vous!

Pour référence, voici où j’ai eu le script: PHP5.2.10 pour Ubuntu 10

Il y a plusieurs personnes là-bas qui confirment toutes que cela fonctionne et que cela a fonctionné pour moi. 

3
Tisch

Rasmus Lerdorf, qui a créé PHP, maintient une solution active Vagrant qui semble répondre à vos besoins. Il permet de basculer rapidement entre les versions PHP, prenant actuellement en charge plus de 20 versions différentes. Il sort des sentiers battus avec un serveur nginx, mais peut facilement être basculé sur Apache2 avec un paramètre préconfiguré. Il supporte également MySQL prêt à l'emploi.

De cette façon, vous aurez accès à toutes les versions de PHP, déployables sur deux des principaux serveurs Web, dans une boîte vagabonde de Nice, maintenue par le grand homme derrière PHP.

Pour plus d’information, je voudrais me référer à la conférence de m. Lerdorf à https://youtu.be/6XnysJAyThs?t=2864

Le référentiel github contenant la solution Vagrant se trouve sur https://github.com/rlerdorf/php7dev

2
Figidon

Pour tester, je viens d'exécuter plusieurs instances de httpd sur différentes adresses IP. J'ai donc php7 sous 192.168.0.70 et php5.6 sous 192.168.0.56. En production, j'ai un site exécutant un vieil oscommerce sous php5.3 et un fichier de configuration différent pour le site. 

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

C'est aussi un moyen simple d'avoir différents fichiers php.ini pour différents sites. Si vous ne disposez que de quelques sites, c'est un bon moyen de garder les choses organisées et vous n'avez pas à vous soucier de plus d'un site à la fois lorsque vous mettez à niveau quelque chose.

0
Danial

J'ai plusieurs projets en cours d'exécution sur ma boîte. Si vous avez déjà installé plusieurs versions, ce script bash devrait vous aider à basculer facilement. Pour le moment, j'ai php5, php5.6 et php7.0, que je permute souvent en fonction du projet sur lequel je travaille. Voici mon code. 

N'hésitez pas à copier. Assurez-vous de comprendre le fonctionnement du code. Ceci est pour le webhostin. ma boîte locale mes mods sont stockés dans/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
0
Growling Flea