Wie kann man mehrere Versionen von PHP 5.x auf einem Entwicklungs-LAMP-Server ausführen?

81

Ich muss meine PHP-Anwendungen mit mehreren Versionen von PHP 5.x testen, z. B. PHP 5.0.0 und PHP 5.2.8.

Gibt es eine Möglichkeit, einen Entwicklungs-LAMP-Server so zu konfigurieren, dass ich Anwendungen mit mehreren Versionen von PHP5 schnell testen kann?

James Mishra
quelle
Sie sollten in der Lage sein, eine PATH-Variable zu verwenden, aber ich bin nicht 100%, also antworte ich nicht für rep
Malfist
Verwendung mehrerer PHP-Versionen (PHP-FPM & FastCGI) mit ISPConfig 3 (Ubuntu 12.10) - @ hek2mgl: Fragen zu Entwicklungstools sind nicht vom Thema entfernt.
hakre
@hakre Einverstanden, würde die Verwendung von FPM es weniger wahrscheinlich machen, dass sich mehrere Versionen gegenseitig beeinflussen, wenn sie als Apache-Modul geladen werden :)
Ja͢ck
@ Jack: Argh, nicht Apache Module, FCGI;)
hakre
Bisher habe ich phpbrew und php-version ausprobiert, aber beide scheinen PHP nicht zu kompilieren.
schöner Arsch

Antworten:

17

Eine Möglichkeit, dies zu tun, besteht darin, Ihre Hauptversion von PHP mit mod_php einzurichten und alle anderen über Fast CGI an verschiedenen Ports (dh 81, 82, 83 usw.) auszuführen. Dies garantiert jedoch kein vollständig konsistentes Verhalten.

Dana die Gesunde
quelle
32
Eine Idee: Verwenden Sie für PHP 5.2.1 Port 10521. Verwenden Sie für 5.0.0 10500 :)
Wayne
2
Eine andere Möglichkeit wäre, es mit CGI (oder FastCGI) unter verschiedenen Pfaden auszuführen - dh / cgi500 /, / cgi528 /, ...
Gray Panther
Wenn Sie unter Debian arbeiten und eine Verpackung verwenden möchten, empfehle ich, debootstrap zu verwenden, um ein Chroot-System zu erstellen, das Ihre PHP-Version enthält, und dann Apache innerhalb des Chroot-Systems zu konfigurieren.
Max Tsepkov
23

Mit CentOS können Sie eine Kombination aus fastcgi für eine PHP-Version und php-fpm für die andere Version verwenden, wie hier beschrieben:

https://web.archive.org/web/20130707085630/http://linuxplayer.org/2011/05/intall-multiple-version-of-php-on-one-server

Basierend auf CentOS 5.6, nur für Apache

1. Aktivieren Sie rpmforge und epel yum repository

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. Installieren Sie php-5.1

Die CentOS / RHEL 5.x-Serie hat PHP-5.1 im Lieferumfang. Installieren Sie es einfach mit yum, z.

sudo yum install php php-mysql php-mbstring php-mcrypt

3. Kompilieren und installieren Sie PHP 5.2 und 5.3 aus dem Quellcode

Für PHP 5.2 und 5.3 finden wir viele RPM-Pakete im Internet. Sie alle stehen jedoch in Konflikt mit dem mit CentOS gelieferten PHP. Wir sollten sie daher besser aus Soure erstellen und installieren. Dies ist nicht schwierig. Es geht darum, PHP an einem anderen Ort zu installieren.

Bei der Installation von PHP als Apache-Modul können wir jedoch nur eine Version von PHP gleichzeitig verwenden. Wenn wir zum Beispiel zur gleichen Zeit eine andere Version von PHP auf demselben Server ausführen müssen, benötigen verschiedene virtuelle Hosts möglicherweise eine andere Version von PHP. Glücklicherweise kann das coole FastCGI und PHP-FPM helfen.

Erstellen und installieren Sie PHP-5.2 mit aktiviertem FastCGI

1) Installieren Sie die erforderlichen Entwicklungspakete

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

2) Kompilieren und installieren

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) Erstellen Sie ein Fastcgi-Wrapper-Skript

Erstellen Sie die Datei /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/

PHP-fpm bestätigen

Bearbeiten Sie /etc/php53/php-fpm.conf und ändern Sie einige Einstellungen. Dieser Schritt dient hauptsächlich dazu, einige Einstellungen zu kommentieren. Sie können den Wert anpassen, wenn Sie möchten.

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

Starten Sie dann fpm

sudo /etc/init.d/php-fpm start

Installieren und einrichten Sie 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

Richten Sie virtuelle Hosts ein und testen Sie sie

1) Fügen Sie die folgende Zeile zu / etc / hosts hinzu

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

2) Erstellen Sie ein Webdokument-Stammverzeichnis und legen Sie eine index.php darunter ab, um anzuzeigen, dass phpinfo zum Benutzer root wechselt

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

Hinweis: Das leere Verzeichnis / var / www / fcgi-bin ist erforderlich. ENTFERNEN SIE ES NICHT SPÄTER

3) Erstellen Sie eine Apache-Konfigurationsdatei (an httpd.conf anhängen)

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) Starten Sie Apache neu. Besuchen Sie die 3 Websites, um phpinfo anzuzeigen und das Ergebnis zu validieren. dh:

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

Wenn alles in Ordnung ist, können Sie einen der 3 virtuellen Hosts als Vorlage verwenden, um einen neuen virtuellen Host mit der gewünschten PHP-Version zu erstellen.

tntu
quelle
1
Dies ist jedoch nur eine Linkantwort. Bitte geben Sie die relevanten Details in die Antwort ein, anstatt sich vollständig auf die andere Website zu verlassen. Links haben das ärgerliche Problem, dass sie möglicherweise verschwinden, und auf diese Weise enthält SO immer noch nicht die relevanten Informationen.
Maarten Bodewes
Vielleicht möchten Sie sich CloudLinux ansehen. Es ist eine kostenpflichtige Lösung, aber zu einem akzeptablen Preis.
Transilvlad
1
Richtige Antwort! Hier ist die gleiche Lösung für Ubuntu: howtoforge.com/…
Tobias Gaertner
10

Mehrere Instanzen von Apache + PHP zu haben, hat mich nie wirklich gereizt, aber es ist wahrscheinlich der einfachste Weg, dies zu tun. Wenn Sie keine Lust auf KISS haben ... hier ist eine Idee.

Bringen Sie Ihren Apache zum Laufen und versuchen Sie, ihn wie Debian und Ubuntu zu konfigurieren, z. B. Verzeichnisse für geladene Module. Ihr Apache Conf kann folgende Zeilen verwenden:

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

Erstellen Sie dann Ihre erste Version von PHP und geben Sie ihr ein Präfix, in dem die Versionsnummer explizit enthalten ist, z. B. /usr/local/php/5.2.8, /usr/local/php/5.2.6 ...

Das conf / load würde ungefähr so ​​aussehen:

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

Um die Version zu wechseln, müssen Sie lediglich die Lade- und Konfigurationsdateien aus dem Verzeichnis ändern, das Apache für die Dateien einer anderen Version einschließt. Sie können dies mit einem einfachen Bash-Skript automatisieren (löschen Sie die eigentliche Datei, kopieren Sie die Datei mit den alternativen Versionen und starten Sie Apache neu.

Ein Vorteil dieses Setups ist, dass alles konsistent ist, solange Sie die php.ini in Bezug auf Optionen und Module gleich halten (was Sie sowieso mit CGI tun müssten). Sie gehen alle durch SAPI. Ihre Anwendungen benötigen keinerlei Änderungen und müssen auch keine relativen URLs verwenden.

Ich denke, das sollte funktionieren, aber ich habe es auch nicht ausprobiert und werde es wahrscheinlich auch nicht tun, da ich nicht die gleichen Anforderungen habe wie Sie. Kommentieren Sie, wenn Sie es jemals versuchen.

Kobold
quelle
8

Hinweis: Die folgende Methode funktioniert unter Windows.

Eine alternative Methode (wenn es in Ordnung ist, jeweils eine einzelne Version von PHP auszuführen) besteht darin, mehrere Apache-Dienste zu definieren, von denen jeder eine andere PHP-Version verwendet.

Verwenden Sie zunächst die Bedingungen in der Apache-Konfigurationsdatei:

 <ifdefine php54>
    SetEnv PHPRC C:/apache/php54/
    ScriptAlias /php/ "C:/apache/php54/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"
</ifdefine>

<ifdefine php55>
    SetEnv PHPRC C:/apache/php55/
    ScriptAlias /php/ "C:/apache/php55/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"
</ifdefine>

Erstellen Sie jetzt mit httpd.exe zwei separate Dienste über die Befehlszeile (erhöht auf Administrator):

httpd.exe -k install -n Apache224_php54 -D php54

httpd.exe -k install -n Apache224_php55 -D php55

Jetzt können Sie jeweils einen der oben genannten Dienste starten (sollte einer vor dem Starten des anderen herunterfahren).

Wenn Sie Apache zuvor als Dienst installiert haben, können Sie diesen mit dem folgenden Befehl entfernen (ersetzen Sie den Dienstnamen durch den von Ihnen verwendeten):

apache -k uninstall -n Apache224

Ein weiterer Hinweis ist, dass ich persönlich ein "Benachrichtigungsbereich-Symbolprogramm" namens "Seobiseu" verwende, um Dienste nach Bedarf zu starten und zu stoppen. Ich habe die beiden oben genannten Dienste hinzugefügt.

wmac
quelle
Das ist eigentlich eine sehr kluge Lösung. Wenn Sie mehrere Dienste parallel ausgeführt werden sollen, können Sie enthalten Listen 80und Listen 81in jedem ifdefinesind.
Caiosm1005
Gute Idee, aber die Frage bezieht sich auf einen LAMP-Server, nicht auf einen WAMP-Server.
Vinicius Monteiro
4

Da ich verstehe, dass Sie wahrscheinlich über einen lokalen / Desktop-Computer sprechen und wahrscheinlich weiterhin über einen lokalen / Desktop-Computer sprechen möchten , werde ich eine Alternative für Sie herausbringen, nur für den Fall, dass dies Ihnen oder jemand anderem helfen könnte:

Richten Sie mehrere virtuelle Serverinstanzen in der Cloud ein und teilen Sie Ihren Code als Git-Repository zwischen ihnen (oder Mercurial, ich nehme an, obwohl ich keine persönliche Erfahrung habe, brauchen Sie nur etwas Dezentrales). Dies hat den Vorteil, dass Sie einer Produktionserfahrung so nahe wie möglich kommen. Wenn Sie Erfahrung mit der Einrichtung von Servern haben, ist dies nicht so kompliziert (oder teuer, wenn Sie nur einen Server hochfahren möchten, tun Sie, was Sie tun müssen). Drehen Sie es dann wieder herunter, dann sprechen Sie von ein paar Cent bis zu 50 Cent, bis zu ein paar Dollar, wenn Sie es einfach laufen lassen.

Ich mache heutzutage meine gesamte Projektentwicklung in der Cloud und fand es viel einfacher, die Infrastruktur zu verwalten als jemals zuvor, wenn lokale / nicht virtualisierte Installationen verwendet wurden, und dies macht diese Art von Side-by-Side-Szenario fair geradeaus. Ich wollte die Idee nur rauswerfen, wenn Sie nicht darüber nachgedacht hätten.

Jason
quelle
3

Ich habe gerade erfolgreich ein Downgrade von PHP5.3 unter Ubuntu 10 durchgeführt.

Dazu habe ich folgendes Skript verwendet:

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

Für alle, die nicht wissen, wie man Skripte über die Befehlszeile ausführt, gibt es hier ein kurzes Tutorial:

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

Diese 6 Schritte erstellen ein Skript in einem Ordner namens "bin" in Ihrem Home-Verzeichnis. Sie können dieses Skript dann ausführen, indem Sie den folgenden Befehl aufrufen:

~/bin/myscriptname.sh

Oulia!

Hoffe das hilft einigen von euch!

Als Referenz habe ich hier das Skript erhalten: PHP5.2.10 für Ubuntu 10

Es gibt mehrere Leute dort, die alle bestätigen, dass dies funktioniert, und es hat mir sehr gut gefallen.

Tisch
quelle
gutes Skript, obwohl karmic bei mir nicht funktioniert hat, weil ich auf einem Power PC war. Ich habe gerade das Skript verwendet, um meine aktuelle Installation zu entfernen, und dann manuell 2.14
Jason
2

Rasmus Lerdorf, der PHP entwickelt hat, unterhält eine aktive Vagrant-Lösung, die Ihre Anforderungen zu erfüllen scheint. Es ermöglicht den schnellen Wechsel zwischen PHP-Versionen und unterstützt derzeit mehr als 20 verschiedene Versionen. Es wird mit einem Nginx-Server ausgeliefert, kann jedoch mit einer vorkonfigurierten Einstellung problemlos auf Apache2 umgestellt werden. Es unterstützt auch MySQL ab Werk.

Auf diese Weise haben Sie Zugriff auf alle Versionen von PHP, die auf zwei der wichtigsten Webserver bereitgestellt werden können, in einer netten Vagabundbox, die von dem großen Mann hinter PHP verwaltet wird.

Für weitere Informationen möchte ich auf den Vortrag von Herrn verweisen. Lerdorf unter https://youtu.be/6XnysJAyThs?t=2864

Das Github-Repository mit der Vagrant-Lösung finden Sie unter https://github.com/rlerdorf/php7dev

Figidon
quelle
Dies ist meiner Meinung nach wahrscheinlich die "beste" Antwort - eine andere VM für jede Version (aber können Sie mehrere Versionen unter einer IP-Adresse ausführen?). Aber wie ironisch, dass der Schöpfer von PHP dies tun sollte - der größte Fehler von PHP muss die mangelnde Kompatibilität zwischen den Versionen sein, was Joomla zum Beispiel so gut wie unbrauchbar macht.
EML
0

Auf meiner Box laufen mehrere Projekte. Wenn Sie bereits mehr als eine Version installiert haben, sollte Ihnen dieses Bash-Skript beim einfachen Wechsel helfen. Im Moment habe ich PHP5, PHP5.6 und PHP7.0, die ich je nach Projekt, an dem ich arbeite, oft hin und her wechsle. Hier ist mein Code.

Fühlen Sie sich frei zu kopieren. Stellen Sie sicher, dass Sie verstehen, wie der Code funktioniert. Dies ist für den Webhostin. Meine lokale Box Meine Mods sind unter / etc / apache2 / mods-enabled / gespeichert

    #!/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
Knurrender Floh
quelle
0

Zum Testen führe ich nur mehrere Instanzen von httpd unter verschiedenen IP-Adressen aus, sodass php7 auf 192.168.0.70 und php5.6 auf 192.168.0.56 ausgeführt werden. In der Produktion habe ich eine Site, auf der ein alter Oscommerce mit PHP5.3 ausgeführt wird, und ich habe nur eine andere Conf-Datei für die Site

httpd -f /etc/apache2/php70.conf
httpd -f /etc/apache2/php53.conf

Es ist auch eine saubere Möglichkeit, verschiedene php.iniDateien für verschiedene Sites zu haben. Wenn Sie nur ein paar Websites haben, ist dies eine gute Möglichkeit, die Dinge zu organisieren, und Sie müssen sich nicht um mehr als eine Website gleichzeitig kümmern, wenn Sie etwas aktualisieren

Danial
quelle