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


76

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


dans ubuntu il y a apache.conf dans / etc / apache2, j’y ai pensé aussi, peut-être qu’à l’avenir je ferais un paquet qui serait très utile pour les développeurs web

Vous pouvez le faire avec suPHP, pas sûr des détails
Marco Ceppi

1
y at-il quelque chose comme python virtualenv pour avoir des déploiements propres isolés de PHP?
Lenzai

Avez-vous envisagé de configurer des serveurs virtuels Ubuntu à l’aide d’un logiciel de virtualisation que vous utilisiez sans tête? Je serais surpris si ce que vous voulez faire n'est pas bien servi (sans jeu de mots) par une telle configuration.
Simon Hoare

1
Définissez ce que signifie "passer facilement". J'ai utilisé cela pour le travail: mon serveur Web utilisait PHP différent pour .phpet les .php5fichiers. Vous pouvez également configurer votre serveur WWW pour qu’il utilise différentes versions de PHP pour différents ports (comme http://localhost:80et http://localhost:8080) ou différents domaines (comme http://localphp52et http://localphp53), en conservant intactes la structure restante des dossiers. Vous pouvez ainsi facilement comparer l’exécution d’une application Web dans deux environnements en modifiant la configuration actuelle. URL
cprn

Réponses:


61

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.


2
Merci, pouvez-vous s'il vous plaît inclure des instructions? (Onnu vishadheekarikkamo?)
Tachyons

17
Bien que cela puisse théoriquement répondre à la question, il serait préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence.
Nanne

2
Il suffit de vérifier les liens qu'ils ont vraiment une bonne documentation sur leurs sites. Voulez-vous vraiment que je copie-colle des éléments de leur site Web?.
aneeshep

7
Ironiquement, une des raisons pour ne pas simplement poster des liens est linkrot, dont ce post souffre maintenant.
MirroredFate

@aneeshep, ne copiez pas leur documentation, mais des extraits pertinents et quelques lignes sur ce qu'est un "gestionnaire de versions php" et sur la façon de l'utiliser / de le configurer pour ce problème spécifique serait vraiment la bienvenue.
Matthieu

20

Vous pouvez exécuter 2 versions différentes de PHP à la fois, mais ce n'est pas aussi simple que de les obtenir facilement. 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 à de bons tutoriels (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 <?phpet d'utiliser les <?marques courtes, voir les commentaires.)


13

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 relance apache):

sudo update-alternatives --config php

il est utile de se souvenir de l'utilisation phpinfo()et php -vde la vérification car toutes deux peuvent avoir une valeur différente.
Adi Prasetyo

6

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

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

Ajouter 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 d'Ondřej Surý, qui empaquette PHP pour Debian (qui est ensuite utilisé par Ubuntu). Ainsi, ce n'est pas un référentiel officiel, mais 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 de 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 php5 de base afin que PHP 5.6 puisse être installé - alors je viens d'accepter la première suggestion.

J'utilise apache, donc cette configuration m'a fourni apache avec les modules php5.6 et php7.0 disponibles, et le module php5.6 effectivement chargé.

En plus du PHP lui-même, toutes les extensions et autres outils que vous attendez de PHP sont présents pour les deux versions de PHP. Il est donc très facile d'ajouter 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

Maintenant, vous avez installé deux versions de PHP complètement distinctes sur votre système, regardons donc où toutes les pièces sont parties!

Les fichiers de configuration sont tous dans /etc/php/5.6et /etc/php/7.0 respectivement. Ici, vous pouvez configurer quelles extensions sont chargées, définir les paramètres ini et tout le reste pour chaque version de manière isolée.

Je suis un utilisateur d'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 comprend une section sur la reconfiguration de nginx pour utiliser une autre version de PHP.

Depuis la ligne de commande, j'ai à la fois des commandes php5.6 et php7.0 disponibles. J'ai aussi toujours une commande php - regardez dans / etc / alternatives pour voir si c'est un lien symbolique 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 va probablement pointer vers /usr/bin/php, ce qui pour moi est un lien symbolique vers la /etc/alternatives/phpcommande.

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 ce qui se passe /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 à utiliser comme modèle ou créer le vôtre et y insérer toute la configuration appropriée pour l'extension (au minimum, vous en aurez besoin 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, et vous devriez le voir dans la liste des modules générés par le php -m. Astuce de 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.


3

A partir de ce post , 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 basculer entre les versions php installées (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.shet insérez-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

2

Problèmes:

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

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

Solution:

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

  • pour a) Créez un ensemble séparé de configs 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é.


il n'y a pas de script pré-emballé pour compiler ces multiples instances parallele php? Juste pour le faire manuellement et corriger les chemins? Cela signifie donc que toutes les sociétés d’hébergement développent des scripts personnalisés pour exécuter ces versions parallèles et ne partagent jamais leurs efforts.
Lenzai

4
Une seule instance apache peut exécuter 2 versions php à la fois.
Nanne

1

Au lieu d’en faire plusieurs, VirtualHostj’ajoute simplement le code ci-dessous dans mon .htaccessfichier 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-fpmavant d'utiliser le code.


0

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


1
J'ai déjà installé PHP 5.3.5. Comment puis-je installer PHP 5.2.17? Pourriez-vous s'il vous plaît me dire où et ce que je dois changer pour basculer entre ces deux versions? Le fichier httpd.conf est vide dans mon installation.
Debiprasad

0

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 c'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.


3
Bienvenue sur Ask Ubuntu! Bien que cela puisse théoriquement répondre à la question, il serait préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence.
user98085

Je n'ai pas eu le temps de faire ce que vous avez dit. Je suppose que je voulais seulement montrer un chemin. Stil doit apprendre à utiliser les outils de formatage. Merci quand même!
Henrique Fernandes

0

J'ai écrit un script bash qui me permet de basculer facilement entre les versions php installées sur ma boîte. 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 des versions plus anciennes 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

J'ai eu le même problème quand je manipulais plusieurs projets. Je me suis référé à cet article. C’est comme chaque fois que j’ai besoin de changer de version si besoin est, mais cela donne la flexibilité nécessaire pour cli et web séparément.

Passer 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

Passer 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

Bien que ce lien puisse répondre à la question, il est préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien pour référence. Les réponses avec lien uniquement peuvent devenir non valides si la page liée est modifiée. - De l'avis
waltinator

@waltinator Merci pour l'examen, bien sûr, prendra soin de cela
Shivdhwaj Pandey

0

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.