81 votes

Comment faire fonctionner plusieurs versions de PHP 5.x sur un serveur LAMP de développement ?

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

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

0 votes

Vous devriez pouvoir utiliser une variable PATH, mais je ne suis pas sûr de moi et je ne répondrai donc pas à la place du représentant.

0 votes

Comment utiliser plusieurs versions de PHP (PHP-FPM & FastCGI) avec ISPConfig 3 (Ubuntu 12.10) - @hek2mgl : Les questions sur les outils de développement ne sont pas hors sujet.

0 votes

@hakre D'accord, l'utilisation de FPM rendrait moins probable que des versions multiples s'affectent mutuellement lorsqu'elles sont chargées en tant que module Apache :)

23voto

tntu Points 3041

Avec CentOS, vous pouvez le faire en utilisant une combinaison de 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 les dépôts 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. Installer 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 des sources

Pour php 5.2 et 5.3, on trouve de nombreux paquets rpm sur Internet. Cependant, ils sont tous en conflit avec le php fourni avec CentOS, nous ferions donc mieux de les construire et de les installer depuis l'extérieur, ce n'est pas difficile, l'important est d'installer php à des endroits différents.

Cependant, lorsque l'on installe php en tant que module Apache, on ne peut utiliser qu'une seule version de php à la fois. Si nous avons besoin de faire tourner différentes versions de php sur le même serveur, en même temps, par exemple, différents hôtes virtuels peuvent avoir besoin de différentes versions de php. Heureusement, FastCGI et PHP-FPM peuvent nous aider.

Construire et installer php-5.2 avec fastcgi activé

1) Installer les paquets de développement nécessaires

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

2) Compilation et installation

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 wrapper fastcgi script.

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

Editez /etc/php53/php-fpm.conf, modifiez certains paramètres. Cette étape consiste principalement à décommenter certains paramètres, vous pouvez ajuster les valeurs 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

Configurer et tester les hôtes virtuels

1) Ajoutez la ligne suivante au fichier /etc/hosts

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

2) Créer le document web Root et y placer un index.php pour afficher phpinfo passer à l'utilisateur Root, exécuter

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

Note : Le répertoire vide /var/www/fcgi-bin est obligatoire, NE LE SUPPRIMEZ PAS PLUS TARD.

3) Créer le fichier de configuration d'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émarrer apache. visiter les 3 sites respectivement pour voir phpinfo et valider le résultat. ie :

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

Si tout est OK, 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.

1 votes

Il s'agit toutefois d'une réponse par lien uniquement. Veuillez inclure les détails pertinents dans la réponse au lieu de vous fier entièrement à l'autre site. Les liens ont l'inconvénient de pouvoir disparaître et, de cette manière, la réponse ne contient toujours pas les informations pertinentes.

0 votes

Vous pourriez envisager d'utiliser CloudLinux. Il s'agit d'une solution payante, mais son prix est acceptable.

1 votes

Bonne réponse ! Voici la même solution pour Ubuntu : howtoforge.com/

17voto

Dana the Sane Points 7976

Une façon de procéder est de configurer votre version principale de php avec mod_php et d'exécuter toutes les autres via fast cgi sur des ports différents (c'est-à-dire 81, 82, 83, etc.). Cela ne garantit cependant pas un comportement totalement cohérent.

32 votes

Une idée : Pour PHP 5.2.1, utilisez le port 10521. Pour 5.0.0, utilisez 10500 :)

2 votes

Une autre option serait de l'exécuter en utilisant CGI (ou FastCGI) sous différents chemins - c'est-à-dire /cgi500/, /cgi528/, ...

0 votes

Si vous êtes sous Debian et que vous souhaitez utiliser l'empaquetage, je vous recommande d'utiliser debootstrap pour créer un système chroot qui contient votre version de PHP, puis de configurer Apache à l'intérieur du système chrooté.

10voto

Leprechaun Points 256

Avoir plusieurs instances d'apache + php n'a jamais vraiment chatouillé mon imagination, mais c'est probablement la façon la plus simple de le faire. Si vous n'avez pas envie de faire du KISS ... voici une idée.

Faites fonctionner votre apache, et essayez de le configurer comme le font debian et ubuntu, par exemple en ayant des répertoires pour les modules chargés. Votre conf d'apache peut utiliser des lignes comme celles-ci :

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

Construisez ensuite votre première version de php, et donnez-lui un préfixe contenant explicitement le numéro de version, par exemple, /usr/local/php/5.2.8, /usr/local/php/5.2.6 ...

Le 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 passer d'une version à l'autre, il suffit de changer les fichiers load et conf du répertoire sur lequel apache fait l'include pour ceux d'une autre version. Vous pouvez automatiser cela avec un simple bash script (supprimer le fichier actuel, copier le fichier des versions alternatives à la place, et redémarrer apache.

L'avantage de cette configuration est que tout est cohérent, tant que vous gardez les php.ini identiques en termes d'options et de modules (ce que vous devriez faire avec CGI de toute façon). Ils passent tous par SAPI. Vos applications n'auront pas besoin de changer quoi que ce soit, ni d'utiliser des URLs relatives.

I piense en cela devrait fonctionner, mais encore une fois, je n'ai pas essayé, et je ne suis pas prêt de le faire car je n'ai pas les mêmes exigences que vous. N'hésitez pas à commenter si vous essayez un jour.

4voto

Jason Points 4379

Sachant que vous parlez probablement d'une machine locale/de bureau et que vous aimeriez probablement continuer Je vais vous proposer une alternative au cas où cela vous aiderait ou aiderait quelqu'un d'autre :

Mettez en place plusieurs instances de serveurs virtuels dans le nuage, et partagez votre code entre eux comme un dépôt git (ou mercurial, je suppose, bien que je n'ai pas d'expérience personnelle - tout ce dont vous avez vraiment besoin est quelque chose de décentralisé). Cela a l'avantage de vous donner une expérience aussi proche que possible de la production, et si vous avez de l'expérience dans la mise en place de serveurs, ce n'est pas si compliqué (ou cher, si vous voulez juste faire tourner un serveur, faire ce que vous avez à faire, puis le faire tourner à nouveau, alors vous parlez de quelques centimes jusqu'à disons 50 centimes, jusqu'à quelques dollars si vous le laissez simplement fonctionner).

Je développe tous mes projets dans le nuage ces jours-ci et je trouve qu'il est beaucoup plus simple de gérer l'infrastructure que je ne l'ai jamais fait lorsque j'utilisais des installations locales/non virtualisées, et cela rend ce genre de scénario côte à côte assez simple à mettre en œuvre. Je voulais juste lancer l'idée si vous ne l'aviez pas encore envisagée.

3voto

Tisch Points 896

Je viens de passer avec succès de PHP5.3 à 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 aidera certains d'entre vous !

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

Il y a plusieurs personnes sur ce site qui confirment toutes que cela fonctionne, et cela a bien fonctionné pour moi.

0 votes

Bon script, bien que karmic n'ait pas fonctionné pour moi parce que j'étais sur Power PC. J'ai juste utilisé le script pour supprimer mon installation actuelle puis j'ai construit manuellement la 2.14.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X