it-swarm.com.de

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

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?

76
Debiprasad

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

Mein Favorit ist PHPBrew. Hoffe das hilft.

61
aneeshep

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 diese Seite sehen. Sie fügen einen anderen Handler in Ihrer Konfiguration hinzu, basierend auf der Situation/dem Port/der Domäne, 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). This und That

(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) einwandfrei funktionieren, aber der Benutzer hat vergessen, <?php und <? mit deaktivierten Shorttags zu verwenden. Siehe die Kommentare )

20
Nanne

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
13
Marcelo Ágil

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

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

PPA hinzufügen

Die Pakete PHP 5.6 und PHP 7.0 stammen von einem Drittanbieter-PPA, der nicht von den offiziellen Ubuntu-Repositorys 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) paketiert. Obwohl es kein offizielles Repository ist, ist es kein Zufall! Die PPA selbst ist hier

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   

Installiere 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. Der erste Lösungsvorschlag bestand darin, alle Standard-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 PHP selbst gibt es für beide Versionen von PHP alle Erweiterungen und sonstigen Tools, die Sie von PHP erwarten fügen Sie in den Modulen hinzu, die Sie benötigen. 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 befinden sich alle in /etc/php/5.6 und /etc/php/7.0 - hier können Sie konfigurieren, welche Erweiterungen geladen werden, die INI-Einstellungen festlegen und alles Weitere für jede Version einzeln.

Ich bin ein Apache-Benutzer und wie bereits erwähnt, 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 genauso einfach. Digital Ocean verfügt über eine gute Dokumentation dazu (sie haben großartige Dokumente!). Lesen Sie daher den Leitfaden: 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 php -v ausführen.

* Genauer gesagt, führen Sie die PHP-Datei aus, um zu sehen, welche Version von PHP verwendet wird - dies wird jedoch wahrscheinlich auf /usr/bin/php verweisen, was für mich selbst ein Symlink zum Befehl /etc/alternatives/php ist .

Mit Erweiterungen arbeiten

Diese PPA wird mit dem üblichen Paket php-pear 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 zu schauen, was in /etc/php/mods-available enthalten ist. 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 eines kopieren, um es als Vorlage zu verwenden, oder ein eigenes erstellen und alle relevanten Konfigurationen für die Erweiterung darin ablegen (Sie benötigen mindestens 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 erstellt, damit Ihre aktuelle Version von PHP dieses Modul lädt. Sie sollten sie in der Liste der Module sehen, die von php -m ausgegeben werden. 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.

6
Daniel Pineda

Von diesem Beitrag , ich habe nur die Befehle in der Reihenfolge angeordnet und erklärt, in der 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

Skriptmanager-Versionen PHP: Erstellen Sie eine Datei mit dem Namen php.sh und fügen Sie sie in /bin/ ein:

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

Probleme:

  1. Eine einzelne 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.

2
Mekk

Anstatt mehrere VirtualHost zu erstellen, füge ich einfach den folgenden Code in meine .htaccess -Datei ein und überraschenderweise hat es funktioniert.

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

Knoten: Ich hatte php7.2-fpm bereits installiert, bevor ich den Code verwendet habe.

1
Rohan Kumar

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

  • zu älterer Version wechseln -
    a2dismod php7.0
    Service Apache2 neu starten
  • auf neuere version wechseln
    a2enmod php7.0
    Service Apache2 neu starten
0
Vikas Chauhan

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.

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

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 an die richtige Position verschiebt, bevor Sie Apache starten.

0
Martin Ueding

Ich hatte das gleiche Problem, als ich mehrere Projekte abwickelte. Ich bezog mich auf diesen Artikel 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
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
Growling Flea