web-dev-qa-db-fra.com

Comment avoir deux versions de PHP installées et basculer facilement entre elles?

Je veux avoir à la fois PHP 5.2.17 et PHP 5.3.5 installé sur ma machine Ubuntu et passer selon mes besoins. Comment puis-je atteindre cet objectif?

76
Debiprasad

Vous pouvez utiliser un gestionnaire de version php pour y parvenir. Différents gestionnaires de versions sont disponibles comme:

Mon préféré est phpbrew. J'espère que cela t'aides.

61
aneeshep

Vous pouvez exécuter simultanément deux versions de PHP, mais ce n'est pas aussi simple que de simplement les obtenir. Vous devez exécuter une version installée séparément et la servir conformément aux paramètres de votre configuration Apache.

Vous pouvez le faire en utilisant fastcgi par exemple: ce que vous recherchez, en gros, est la configuration que vous voyez sur cette page . Vous ajoutez un gestionnaire différent dans votre configuration en fonction de la situation/port/domaine dont vous avez besoin. Le truc, après avoir installé les deux versions, est la suivante:

=== de cette page ==

  1. La dernière étape consistait à créer des hôtes virtuels. En fin de compte, j'ai trois fichiers dans/etc/Apache2/sites-enabled: 000-default, php5.3.17 et php5.4.7 avec le contenu suivant

défaut:

    <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>

Voir pour l'installation complète la question liée . N'oubliez pas de regarder également les deux liens dans l'en-tête, ils ressemblent à des tutoriels Nice (mais moins compressés). Ceci et Cela

(Ne vous fiez pas au fait que la question liée est une grande question sans réponse acceptée. La méthode devrait (et ne fonctionne pas) bien, mais l'utilisateur a oublié d'utiliser <?php et utilisé <? avec les marques courtes désactivées, voir les commentaires. )

20
Nanne

J'ai installé php 5.6 et 7.0 mais, en plus de toutes les astuces, il continuait à fonctionner à 5.6, cette commande enregistre le jour (dans mon cas, je sélectionne l'option 1 et redémarre Apache):

Sudo update-alternatives --config php
13
Marcelo Ágil

Celui-ci fonctionne pour moi: https://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubunt

Identique au script de "Growling Flea", mais utilisant de nouvelles versions.

Ajoutez le PPA

Les packages PHP 5.6 et PHP 7.0 proviennent d'un PPA tiers, non fourni par les référentiels officiels Ubuntu de Canonical. Les PPA que je recommande ici proviennent de Ondřej Surý qui empaquette PHP pour Debian (qui est ensuite utilisé par Ubuntu). Ainsi, même s'il ne s'agit pas d'un référentiel officiel, il n'est pas vraiment aléatoire! Le PPA lui-même est ici

Pour ajouter le PPA à votre configuration:

Sudo add-apt-repository ppa:ondrej/php  

Ensuite, nous voudrons également récupérer des informations sur les offres de ce nouveau PPA, alors exécutez:

Sudo apt-get update   

Installer les nouvelles versions de PHP

Certains paquets php5 ont déjà été installés, mais je n’ai rien désinstallé, j’ai simplement laissé apt à préciser ce qu’il voulait faire quand je lui ai demandé d’installer les nouvelles versions:

Sudo apt-get install php5.6 php7.0

Cela a entraîné beaucoup de plaintes d'apt et de nombreux conflits. La première solution suggérée consistait à supprimer tous les packages stock php5 afin que PHP 5.6 puisse être installé - donc je viens d'accepter la première suggestion.

J'utilise Apache alors cette configuration m'a donné Apache avec les modules php5.6 et php7.0 disponibles, et le module php5.6 réellement chargé.

En plus du PHP lui-même, toutes les extensions et autres outils que vous attendez de PHP sont présents dans les deux versions de PHP, il est donc très facile de ajoutez les modules dont vous avez besoin. J'ai été très très impressionné par la qualité de son travail.

Configuration et changement de version

Vous avez maintenant installé deux versions distinctes de PHP sur votre système. Voyons donc où sont passées toutes les pièces!

Les fichiers de configuration sont tous respectivement dans /etc/php/5.6 et /etc/php/7.0 - vous pouvez y configurer les extensions chargées, définir les paramètres ini et tout le reste séparément pour chaque version.

Je suis un utilisateur Apache et, comme je l'ai mentionné, les deux modules sont disponibles. Donc, pour passer de l'un à l'autre, je dois faire:

Sudo a2dismod php5.6
Sudo a2enmod php7.0
Sudo service Apache2 restart

Pour les utilisateurs de nginx, les changements sont presque aussi simples. Digital Ocean dispose d’une bonne documentation (ils ont une excellente documentation!). Consultez leur guide: https://www.digitalocean.com/community/tutorials/ how-to-upgrade-to-php-7-on-ubuntu-14-04 car il inclut une section sur la reconfiguration de nginx pour utiliser une autre version de PHP.

Depuis la ligne de commande, j'ai à la fois php5.6 et php7.0 disponibles en tant que commandes. J'ai aussi toujours une commande php - regardez dans/etc/alternatives pour voir qu'il s'agit de liens symboliques vers une version particulière de PHP cli *. Vous pouvez également vérifier rapidement lequel vous utilisez en exécutant php -v.

* Plus spécifiquement, lancez php pour voir quelle version de PHP est utilisée - mais cela pointera probablement sur /usr/bin/php, qui pour moi est lui-même un lien symbolique vers la commande /etc/alternatives/php.

Travailler avec des extensions

Ce PPA est livré avec le paquet php-pear habituel qui propose la commande pecl pour les deux versions de PHP, de sorte que toutes les extensions disponibles via PECL peuvent être installées de la manière habituelle. Vous aurez également besoin des en-têtes appropriés pour que php5.6-dev ou php7.0-dev soit installé.

Quand l'installation de pecl est terminée, vous recevrez une note pour ajouter le fichier * .so à votre php.ini; En fait, la meilleure chose à faire ici est de regarder le contenu de /etc/php/mods-available. Il y aura déjà quelques modules ici, chacun dans son propre fichier nommé d'après l'extension et se terminant par .ini. Vous pouvez en copier un pour l'utiliser comme modèle ou créer le vôtre et y placer toute la configuration appropriée pour l'extension (vous devez au minimum extension=[extensionName].so).

Une fois que la nouvelle extension est dans les mods disponibles, activez-la puis vérifiez-la en faisant:

Sudo phpenmod extension  
php -m  

Cela créera les liens symboliques aux bons endroits pour que votre version actuelle de PHP charge ce module. Vous devriez le voir dans la liste des modules générés par le php -m. Conseil pro: si vous ne le voyez pas dans la sortie, faites défiler l'écran jusqu'en haut pour voir s'il y a des messages d'erreur utiles.

6
Daniel Pineda

De cet article , je viens de mettre en ordre les commandes et de les expliquer dans l’ordre car j’ai été servi (Ubuntu 12.04)

Cette méthode vous donne:

  1. script avec menu, qui permet de passer d'une version à l'autre installée (pas les deux en même temps)

  2. diverses versions de PHP installées sur votre serveur

  3. fichiers de configuration séparés

Installez toutes les versions dont vous avez besoin (j'en ai deux)

Installez des dépendances:

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

Installez PHP 5.3 pour la première fois. Télécharger les sources 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

Installez PHP5.6 pour la première fois. Télécharger les sources 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

Versions du gestionnaire de script PHP: créez un fichier appelé php.sh et mettez-le dans /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

Compiler et installer 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

Compiler et installer 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

Utilisons-les:

$ 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
3
PegasusOnlin

Problèmes:

  1. Une seule instance Apache ne peut pas exécuter deux versions différentes PHP simultanément (du moins autant que je le sache).

  2. Deux versions PHP différentes ne peuvent pas être installées à partir de packages car elles entreront en conflit (et essayeront d'écraser les mêmes répertoires).

Solution:

  • pour b) Compiler „l'autre” PHP version à partir de la source, manuellement (ou si vous préférez, récupérez la source du paquet approprié et modifiez-la pour éviter les conflits et modifier les chemins d'installation)

  • pour a) Créez un ensemble séparé de configurations pour Apache avec différents chemins de modules et un script de démarrage séparé. Et bien sûr, exécutez-le sur un port séparé.

2
Mekk

Au lieu de créer plusieurs VirtualHost, j’ajoute simplement le code ci-dessous dans mon fichier .htaccess et, étonnamment, cela a fonctionné,

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

Node: J'avais déjà installé php7.2-fpm avant d'utiliser le code.

1
Rohan Kumar

Cela peut être fait en désactivant et en activant la nouvelle version de PHP.

  • passer à l'ancienne version -
    a2dismod php7.0
    service Apache2 restart
  • passer à la nouvelle version
    a2enmod php7.0
    service Apache2 restart
0
Vikas Chauhan

Vous pouvez également exécuter chaque site Web avec différents utilisateurs. Plus sécurisé.

J'ai utilisé cette approche une fois.

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

Maintenant, je pense qu'il est préférable d'utiliser php-fpm ... mais il est un peu plus compliqué de configurer plusieurs versions de php.

Il faudra exécuter plusieurs php-fpms et configurer Apache pour qu’ils s’utilisent les uns les autres.

0
Henrique Fernandes

Si vous voulez les exécuter en même temps, vous avez besoin de deux ports différents. Vous pouvez peut-être simplement changer votre configuration Apache (httpd.conf) avec un simple script qui déplace l'une ou l'autre version à la position correcte avant de démarrer Apache.

0
Martin Ueding

J'ai eu le même problème quand je manipulais plusieurs projets. J'ai mentionné cet article Mais c'était comme si chaque fois que je devais changer de version si nécessaire, mais cela donne la flexibilité nécessaire pour cli et web séparément.

Passant de PHP5.6 à PHP7.0

Pour Apache, nous pouvons utiliser la commande en tant que:

Sudo a2dismod php5.6 ; Sudo a2enmod php7.0 ; Sudo service Apache2 restart

Pour la CLI, nous pouvons utiliser la commande en tant que:

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

Passage de php7.0 à php5.6

Pour Apache, nous pouvons utiliser la commande en tant que:

Sudo a2dismod php7.0 ; Sudo a2enmod php5.6 ; Sudo service Apache2 restart

Pour la CLI, nous pouvons utiliser la commande en tant que:

Sudo update-alternatives --set php /usr/bin/php5.6
0
Shivdhwaj Pandey

J'ai écrit un script bash qui me permet de basculer facilement entre les versions php installées sur ma box. J'exécute plusieurs hôtes virtuels car j'ai plusieurs projets Web avec des clients qui ont d'anciens et de nouveaux programmes. Certains de ces projets nécessitent d'anciennes versions de php et d'autres projets requièrent php7.0.

Lisez mes commentaires et assurez-vous de bien comprendre ce qui se passe avant de l'utiliser.

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