Wie lassen sich zwei PHP-Versionen installieren und problemlos zwischen ihnen wechseln?


76

Ich möchte sowohl PHP 5.2.17 als auch PHP 5.3.5 auf meinem Ubuntu-Rechner installiert haben und nach Bedarf wechseln. Wie kann ich das erreichen?


in ubuntu gibt es apache.conf in / etc / apache2, ich dachte auch darüber nach, vielleicht werde ich in der Zukunft ein Paket machen, das für Webentwickler sehr nützlich wäre

Sie können dies mit suPHP tun, nicht sicher die Details
Marco Ceppi

1
Gibt es etwas wie Python Virtualenv, um saubere, isolierte PHP-Bereitstellungen zu haben?
Lenzai

Haben Sie darüber nachgedacht, virtuelle Ubuntu-Server mit einer Virtualisierungssoftware einzurichten, die Sie kopflos verwenden? Es würde mich wundern, wenn das, was Sie tun möchten, durch eine solche Einstellung nicht gut bedient wird (kein Wortspiel beabsichtigt).
Simon Hoare

1
Definieren Sie, was es heißt, einfach zu wechseln. Ich habe das für die Arbeit benutzt: Mein Webserver verwendete verschiedene PHP- Dateien für .phpund .php5. Sie können Ihren WWW-Server auch so konfigurieren, dass unterschiedliche PHP-Versionen für unterschiedliche Ports (wie http://localhost:80und http://localhost:8080) oder unterschiedliche Domänen (wie http://localphp52und http://localphp53) verwendet werden. Die verbleibende Ordnerstruktur bleibt dabei erhalten, sodass Sie die Ausführung einer Webanwendung in zwei Umgebungen durch Ändern der aktuellen Version problemlos vergleichen können URL.
cprn

Antworten:


61

Sie können einen PHP-Versionsmanager verwenden, um dies zu erreichen. Verschiedene Versionsmanager sind verfügbar wie:

Mein Favorit ist PHPBrew. Hoffe das hilft.


2
Danke, können Sie bitte Anweisungen beifügen? (onnu vishadheekarikkamo?)
Tachyons

17
Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Nanne

2
Überprüfen Sie einfach die Links, über die sie wirklich gute Dokumentation auf ihren Websites haben. Möchten Sie wirklich, dass ich Dinge von ihrer Website kopiere und einfüge?
Aneeshep

7
Ironischerweise ist einer der Gründe, nicht nur Links zu posten, Linkrot, worunter dieser Beitrag jetzt leidet.
MirroredFate

@aneeshep, nicht kopieren-einfügen ihrer Dokumentation, aber relevante Auszüge und ein paar Zeilen darüber, was ein "PHP-Versionsmanager" ist und wie man ihn für dieses spezifische Problem benutzt / konfiguriert, wären wirklich willkommen.
Matthieu

20

Sie können 2 verschiedene PHP-Versionen gleichzeitig ausführen, aber es ist nicht so einfach, sie einfach zu bekommen. Sie müssen eine separat installierte Version ausführen und diese gemäß den Einstellungen in Ihrer Apache-Konfiguration bereitstellen.

Sie können dies zum Beispiel mit fastcgi tun: Im Grunde ist das, wonach Sie suchen, die Konfiguration, die Sie auf dieser Seite sehen . Sie fügen einen anderen Handler in Ihrer Konfiguration hinzu, der auf der Situation / dem Port / der Domäne basiert, die Sie benötigen. Der Trick nach der Installation beider Versionen ist dieser Schritt:

=== von dieser Seite ==

  1. Der letzte Schritt bestand darin, virtuelle Hosts zu erstellen. Am Ende habe ich drei Dateien in / etc / apache2 / sites-enabled: 000-default, php5.3.17 und php5.4.7 mit folgendem Inhalt

Standard:

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

Siehe für die vollständige Installation die verknüpfte Frage . Vergessen Sie nicht, auch die beiden Links in der Kopfzeile zu betrachten, sie sehen aus wie nette Tutorials (aber weniger komprimiert). Dies und Das

(Lassen Sie sich nicht von der Tatsache abbringen , dass die verknüpfte Frage eine große Frage ohne akzeptierte Antwort ist. Die Methode sollte (und funktioniert) gut funktionieren, aber der Benutzer hat vergessen, sie zu verwenden <?phpund sie <?mit deaktivierten Shorttags zu verwenden. Siehe die Kommentare.)


13

Ich habe PHP 5.6 und 7.0 installiert, aber abgesehen von allen Tipps hat PHP 5.6 weiterhin ausgeführt, sodass dieser Befehl den Tag spart (in meinem Fall habe ich Option 1 gewählt und Apache neu gestartet):

sudo update-alternatives --config php

Es ist nützlich, sich an die Verwendung zu erinnern phpinfo()und diese php -vzu überprüfen, da beide einen unterschiedlichen Wert haben können.
Adi Prasetyo

6

Dieser funktioniert für mich: https://lornajane.net/posts/2016/php-7-0-and-5-6-on-ubuntu

Entspricht dem Skript von "Growling Flea", verwendet jedoch neue Versionen.

Fügen Sie das PPA hinzu

Die Pakete PHP 5.6 und PHP 7.0 stammen von einem Drittanbieter-PPA, der nicht von den offiziellen Ubuntu-Repositories von Canonical bereitgestellt wird. Die PPAs, die ich hier empfehle, stammen von Ondřej Surý, der PHP für Debian (das dann von Ubuntu verwendet wird) paket. Obwohl es kein offizielles Repository ist, ist es nicht zufällig! Die PPA selbst ist da

So fügen Sie die PPA zu Ihrem Setup hinzu:

sudo add-apt-repository ppa:ondrej/php  

Dann möchten wir auch Informationen über das Angebot dieser neuen PPA erhalten. Führen Sie dann Folgendes aus:

sudo apt-get update   

Installieren Sie neue PHP-Versionen

Ich hatte bereits einige der php5-Pakete installiert, aber ich habe nichts deinstalliert. Ich habe apt einfach herausfinden lassen, was es tun wollte, als ich darum gebeten habe, die neuen Versionen zu installieren:

sudo apt-get install php5.6 php7.0

Dies führte zu vielen Beschwerden und Konflikten. Die erste vorgeschlagene Lösung bestand darin, alle auf Lager befindlichen PHP5-Pakete zu entfernen, damit PHP 5.6 installiert werden kann - also habe ich nur den ersten Vorschlag angenommen.

Ich benutze Apache, also gab mir dieses Setup Apache mit den verfügbaren Php5.6- und Php7.0-Modulen und dem tatsächlich geladenen Php5.6-Modul.

Neben dem eigentlichen PHP gibt es für beide PHP-Versionen auch alle anderen Erweiterungen und Tools, die Sie von PHP erwarten. Daher ist es sehr einfach, die von Ihnen benötigten Module hinzuzufügen. Ich war sehr, sehr beeindruckt, wie gut das gemacht wird.

Versionen konfigurieren und wechseln

Jetzt haben Sie zwei völlig getrennte Versionen von PHP auf Ihrem System installiert. Schauen wir uns also an, wohin alle Teile gegangen sind!

Die Konfigurationsdateien sind alle in /etc/php/5.6und /etc/php/7.0 jeweils - innerhalb von hier, wo Sie konfigurieren können , die Erweiterungen geladen sind, stellen Sie die INI - Einstellungen, und alles andere für jede Version in der Isolation.

Ich bin ein Apache-Benutzer, und wie ich bereits erwähnte, sind beide Module verfügbar. Um also von einem zum anderen zu wechseln, muss ich Folgendes tun:

sudo a2dismod php5.6
sudo a2enmod php7.0
sudo service apache2 restart

Für nginx Benutzer sind die Änderungen fast so einfach, Digital Ozean hat eine gute Dokumentation auf diese so ihre Führung Check - out (sie großen docs tun haben!): Https://www.digitalocean.com/community/tutorials/how-to- upgrade-to-php-7-on-ubuntu-14-04 enthält einen Abschnitt zur Neukonfiguration von nginx für die Verwendung einer anderen PHP-Version.

Von der Kommandozeile aus habe ich sowohl php5.6 als auch php7.0 als Kommandos zur Verfügung. Ich habe auch noch einen PHP-Befehl - schauen Sie in / etc / alternatives nach, um zu sehen, dass dieser mit einer bestimmten Version von PHP cli * verknüpft ist. Sie können auch schnell überprüfen, welche von Ihnen verwendet wird, indem Sie ausführen php -v.

* Genauer gesagt, starten Sie welche PHP-Version, um zu sehen, welche PHP-Version verwendet wird - aber dies weist wahrscheinlich darauf hin /usr/bin/php, was für mich selbst ein Symlink zum /etc/alternatives/phpBefehl ist.

Mit Erweiterungen arbeiten

Diese PPA wird mit dem üblichen php-pear-Paket geliefert, das den Befehl pecl für beide PHP-Versionen bietet, sodass alle über PECL verfügbaren Erweiterungen auf die übliche Weise installiert werden können. Sie benötigen auch die entsprechenden Header, sodass entweder php5.6-dev oder php7.0-dev installiert sein sollte.

Nach Abschluss der PECL-Installation erhalten Sie eine Notiz, in der Sie die * .so-Datei zu Ihrer php.ini hinzufügen müssen. Tatsächlich ist es das Beste, hier nachzuschauen, was drin ist /etc/php/mods-available. Es werden bereits einige Module vorhanden sein, jedes in einer eigenen Datei, die nach der Erweiterung benannt ist und auf .ini endet. Sie können eine Vorlage kopieren, um sie als Vorlage zu verwenden, oder eine eigene erstellen und alle relevanten Konfigurationen für die Erweiterung darin ablegen (mindestens die erforderliche extension=[extensionName].so).

Sobald die neue Erweiterung in Mods verfügbar ist, aktiviere und überprüfe sie wie folgt:

sudo phpenmod extension  
php -m  

Dadurch werden die Symlinks an den richtigen Stellen für Ihre aktuelle PHP-Version erstellt, um dieses Modul zu laden. Sie sollten sie in der Liste der Module sehen, die von ausgegeben werden php -m. Tipp: Wenn Sie es in der Ausgabe nicht sehen, scrollen Sie ganz nach oben und prüfen Sie, ob dort nützliche Fehlermeldungen angezeigt werden.


3

In diesem Beitrag habe ich nur die Befehle in die richtige Reihenfolge gebracht und erklärt, wie ich bedient wurde (Ubuntu 12.04).

Diese Methode gibt Ihnen:

  1. Skript mit Menü, das den Wechsel zwischen den installierten PHP-Versionen erlaubt (nicht beide gleichzeitig)

  2. verschiedene PHP-Versionen auf Ihrem Server installiert

  3. getrennte conf-Dateien

Installieren Sie alle Versionen, die Sie benötigen (ich habe zwei)

Abhängigkeiten installieren:

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

Installieren Sie PHP 5.3 zum ersten Mal. Laden Sie PHP-Quellen herunter

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

Installieren Sie PHP5.6 zum ersten Mal. Laden Sie PHP-Quellen herunter

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

Script Manager-Versionen PHP: Erstellen Sie eine Datei mit dem Namen php.shund fügen Sie sie ein /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

Kompiliere und installiere 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

Kompilieren und installieren Sie 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

Lass sie uns benutzen:

$ 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

Probleme:

  1. Eine einzige Apache-Instanz kann nicht zwei verschiedene PHP-Versionen gleichzeitig ausführen (zumindest soweit ich weiß).

  2. Zwei verschiedene PHP-Versionen können nicht aus Paketen installiert werden, da dies zu Konflikten führt (und Sie versuchen, dieselben Verzeichnisse zu überschreiben).

Lösung:

  • für b) Kompilieren Sie „die andere” PHP-Version manuell aus dem Quellcode (oder, wenn Sie es vorziehen, holen Sie sich den Quellcode des entsprechenden Pakets und ändern Sie ihn, um Konflikte zu vermeiden und Installationspfade zu ändern)

  • a) Erstellen Sie separate Konfigurationssätze für Apache mit unterschiedlichen Modulpfaden und separatem Startskript. Und natürlich läuft es auf einem separaten Port.


Gibt es kein vorgefertigtes Skript, um diese mehrere parallele PHP-Instanz zu kompilieren? Nur um es manuell zu tun und Pfade zu patchen? Dies bedeutet also, dass alle Hosting-Unternehmen dort benutzerdefinierte Skripte entwickeln, um diese parallele Version auszuführen und niemals ihre Bemühungen zu teilen.
Lenzai

4
Eine einzelne Apache-Instanz kann 2 PHP-Versionen gleichzeitig ausführen.
Nanne

1

Anstatt mehrere zu VirtualHosterstellen, füge ich einfach den folgenden Code in meine .htaccessDatei ein und überraschenderweise hat es funktioniert.

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

Knoten: Ich hatte bereits php7.2-fpmvor der Verwendung des Codes installiert .


0

Wenn Sie sie gleichzeitig ausführen möchten, benötigen Sie zwei verschiedene Ports. Vielleicht können Sie einfach Ihre Apache-Konfiguration (httpd.conf) mit einem einfachen Skript ändern, das die eine oder andere Version in die richtige Position bringt, bevor Sie Apache starten.


1
Ich habe bereits PHP 5.3.5 installiert. Wie kann ich PHP 5.2.17 installieren? Können Sie mir bitte sagen, wo und was ich ändern muss, um zwischen diesen beiden Versionen zu wechseln? Die Datei httpd.conf ist in meiner Installation leer.
Debiprasad

0

Sie können jede Website auch mit verschiedenen Benutzern betreiben. Sicherer.

Ich habe diesen Ansatz einmal benutzt.

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

Jetzt denke ich, es ist besser, PHP-Fpm zu verwenden ... aber es ist ein bisschen komplizierter, mehrere PHP-Versionen zu konfigurieren.

Muss mehrere PHP-FPMS ausführen und Apache so einstellen, dass sie sich gegenseitig verwenden.


3
Willkommen bei Ask Ubuntu! Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
user98085

Ich hatte nicht genug Zeit, um das zu tun, was du gesagt hast. Ich wollte wohl nur einen Weg zeigen. Ich muss erst lernen, wie man mit dem Formatieren umgeht. Danke trotzdem!
Henrique Fernandes

0

Ich habe ein Bash-Skript geschrieben, mit dem ich einfach zwischen den auf meiner Box installierten PHP-Versionen wechseln kann. Ich führe mehrere virtuelle Hosts aus, weil ich mehrere Webprojekte mit Kunden habe, die alte und neue Programme haben. Einige dieser Projekte erfordern ältere Versionen von PHP und andere Projekte erfordern PHP 7.0.

Lesen Sie meine Kommentare durch und stellen Sie sicher, dass Sie verstehen, was vor sich geht, bevor Sie diese verwenden.

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

Ich hatte das gleiche Problem, als ich mehrere Projekte abwickelte. Ich habe auf diesen Artikel verwiesen. Aber es war wie jedes Mal, wenn ich die Versionen bei Bedarf wechseln musste, aber dies gibt die Flexibilität für CLI und Web getrennt.

Wechsel von php5.6 zu php7.0

Für Apache können wir den Befehl verwenden als:

sudo a2dismod php5.6 ; sudo a2enmod php7.0 ; sudo service apache2 restart

Für CLI können wir den Befehl wie folgt verwenden:

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

Wechsel von php7.0 zu php5.6

Für Apache können wir den Befehl verwenden als:

sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart

Für CLI können wir den Befehl wie folgt verwenden:

sudo update-alternatives --set php /usr/bin/php5.6

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert. - Aus der Bewertung
waltinator

@ Waltinator Vielen Dank für die Überprüfung, wird sich sicher darum kümmern
Shivdhwaj Pandey

0

Dies kann durch Deaktivieren und Aktivieren der neuen Version von PHP-

  • auf ältere version wechseln -
    a2dismod php7.0
    service apache2 neu starten
  • auf neuere version wechseln
    a2enmod php7.0
    service apache2 restart
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.