it-swarm.com.de

Wie kann man mehrere Versionen von PHP 5.x auf einem Entwicklungslamp-Server?

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 zu konfigurieren, um Anwendungen mit mehreren PHP5-Versionen schnell testen zu können?

81
James Mishra

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 (d. H. 81, 82, 83 usw.) auszuführen. Dies garantiert jedoch kein völlig gleichbleibendes Verhalten.

17
Dana the Sane

Mit CentOS können Sie eine Kombination aus fastcgi für eine PHP-Version und PHP-fpm für die andere 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 in der Box. Installieren Sie es einfach mit yum, zB:

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 Sie viele RPM-Pakete im Internet. Sie stehen jedoch alle in Konflikt mit der im Lieferumfang von CentOS enthaltenen php. Daher sollten wir sie besser aus suree erstellen und installieren. Dies ist nicht schwierig. Es geht darum, PHP an einem anderen Ort zu installieren. 

Wenn Sie php als Apache-Modul installieren, können wir jedoch nur eine Version von php gleichzeitig verwenden. Wenn wir zum Beispiel eine andere Version von PHP auf demselben Server ausführen müssen, benötigen andere virtuelle Hosts möglicherweise eine andere Version von PHP. Zum Glück können die coolen FastCGI und PHP-FPM helfen.

Erstellen und installieren Sie php-5.2 mit aktiviertem fastcgi

1) Installieren Sie die erforderlichen dev-Pakete

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 konfigurieren

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

Dann fpm starten

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

Mod_fastcgi, mod_fcgid installieren und einrichten

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

Virtuelle Hosts einrichten und testen

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 das Webdokument-Stammverzeichnis und legen Sie eine index.php darunter ab, um phpinfo Anzuzeigen, wechseln Sie zum Benutzer root

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. NICHT ENTFERNEN.

3) Apache-Konfigurationsdatei erstellen (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) Apache neu starten. Besuchen Sie die 3 Websites respektvoll, um phpinfo anzuzeigen und das Ergebnis zu überprüfen. 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.

23
transilvlad

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

Machen Sie Ihren Apache zum Laufen und versuchen Sie, ihn so zu konfigurieren, wie dies bei debian und ubuntu der Fall ist, 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 ein Präfix mit der explizit enthaltenen Versionsnummer, 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 load- und conf-Dateien aus dem Verzeichnis ändern, in dem Apache das Include für die Dateien einer anderen Version einfügt. Sie können dies mit einem einfachen Bash-Skript automatisieren (löschen Sie die eigentliche Datei, kopieren Sie die alternative Versionsdatei an Ort und Stelle, und starten Sie Apache neu.

Ein Vorteil dieses Setups ist, dass alles konsistent ist. Solange Sie die php.ini hinsichtlich Optionen und Modulen beibehalten (was Sie sonst mit CGI zu tun hätten). 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 andererseits habe ich es nicht ausprobiert oder bin wahrscheinlich dazu bereit, da ich nicht die gleichen Anforderungen habe wie Sie. Machen Sie einen Kommentar, wenn Sie es trotzdem versuchen.

10
Leprechaun

Hinweis: Die folgende Methode funktioniert unter Windows.

Eine alternative Methode (wenn es in Ordnung ist, jeweils eine einzelne Version von PHP auszuführen), ist die Definition mehrerer Apache-Dienste, von denen jeder eine andere PHP -Version verwendet.

Zunächst verwenden Sie 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 nun mithilfe von httpd.exe zwei separate Dienste von der Befehlszeile aus (auf Administratorebene erhöht):

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 vor dem Start des anderen heruntergefahren werden).

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

Apache -k uninstall -n Apache224

Eine weitere Anmerkung ist, dass ich persönlich ein "Benachrichtigungsbereichssymbolprogramm" namens "Seobiseu" verwende, um Dienste nach Bedarf zu starten und zu stoppen. Ich habe die beiden oben genannten Dienste hinzugefügt.

8
wmac

Wenn Sie wissen, dass Sie wahrscheinlich von einem lokalen/Desktop-Computer sprechen und wahrscheinlich fortfahren von einem lokalen/Desktop-Computer sprechen möchten, werde ich eine Alternative für Sie auf den Markt werfen, nur für den Fall, dass es Ihnen oder jemandem helfen könnte sonst:

Richten Sie mehrere virtuelle Serverinstanzen in der Cloud ein und teilen Sie Ihren Code als ein git-Repository (oder Mercurial, nehme ich an, obwohl ich keine persönliche Erfahrung habe. Alles, was Sie wirklich brauchen, ist etwas Dezentrales). Dies hat den Vorteil, dass Sie so nahe wie möglich an einer Produktionserfahrung sind. 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.) dann drehen Sie es wieder runter, dann sprechen Sie von ein paar Cent bis zu 50 Cent, bis zu ein paar Dollar, wenn Sie es einfach laufen lassen).

Ich mache heute meine gesamte Projektentwicklung in der Cloud, und es fiel mir viel einfacher, die Infrastruktur zu verwalten, als wenn ich lokale/nicht-virtualisierte Installationen verwende. Dies macht diese Art von Side-by-Side-Szenario recht ordentlich geradeaus. Ich wollte nur die Idee rauswerfen, wenn Sie nicht darüber nachgedacht hätten.

4
Jason

Ich habe gerade erfolgreich von PHP5.3 auf Ubuntu 10 heruntergestuft.

Dafür 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 Skripts von der Befehlszeile aus ausgeführt werden, gibt es hier eine kurze Anleitung:

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 mit dem Namen "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 bekommen: 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 getan. 

3
Tisch

Rasmus Lerdorf, Entwickler von PHP, pflegt eine aktive Vagrant-Lösung, die Ihre Anforderungen zu erfüllen scheint. Es ermöglicht einen schnellen Wechsel zwischen PHP -Versionen und unterstützt derzeit mehr als 20 verschiedene Versionen. Es wird standardmäßig mit einem Nginx-Server geliefert, kann aber mit einer vorkonfigurierten Einstellung problemlos auf Apache2 umgestellt werden. Es unterstützt auch MySQL sofort.

Auf diese Weise haben Sie Zugriff auf alle PHP-Versionen, die auf zwei der wichtigsten Webserver bereitgestellt werden können, und zwar in einer Nice-Vagrant-Box, die vom großen Mann hinter PHP verwaltet wird.

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

Das github-Repository mit der Vagrant-Lösung befindet sich unter https://github.com/rlerdorf/php7dev

2
Figidon

Zum Testen führe ich einfach mehrere Instanzen von httpd auf verschiedenen IP-Adressen aus, also habe ich php7 auf 192.168.0.70 und php5.6 auf 192.168.0.56. In der Produktion habe ich eine Website, auf der ein alter oscommerce mit php5.3 läuft, und ich habe nur eine andere conf-Datei für die Website 

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

Es ist auch eine saubere Möglichkeit, verschiedene php.ini-Dateien für verschiedene Websites zu haben. Wenn Sie nur über ein paar Sites verfügen, können Sie die Dinge organisiert organisieren und müssen sich nicht um mehr als eine Site auf einmal kümmern, wenn Sie ein Upgrade durchführen

0
Danial

Ich habe mehrere Projekte auf meiner Box. Wenn Sie bereits mehr als eine Version installiert haben, können Sie mit diesem Bash-Skript problemlos wechseln. Im Moment habe ich php5, php5.6 und php7.0, die ich je nach Projekt, an dem ich arbeite, oft hin und her schalte. 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 werden 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
0
Growling Flea