Jak można uruchomić wiele wersji PHP 5.x na serwerze deweloperskim LAMP?

81

Muszę przetestować moje aplikacje PHP z różnymi wersjami PHP 5.x, takimi jak PHP 5.0.0 i PHP 5.2.8.

Czy istnieje sposób, w jaki mogę skonfigurować programistyczny serwer LAMP, aby móc szybko testować aplikacje z wieloma wersjami PHP5?

James Mishra
źródło
Powinieneś móc użyć zmiennej PATH, ale nie jestem w 100%, więc nie odpowiadam na przedstawiciela
Malfist
Jak korzystać z wielu wersji PHP (PHP-FPM i FastCGI) z ISPConfig 3 (Ubuntu 12.10) - @ hek2mgl: Pytania dotyczące narzędzi programistycznych nie są poza tematem.
hakre
@hakre Zgoda, użycie FPM zmniejszyłoby prawdopodobieństwo, że wiele wersji wpłynie na siebie nawzajem po załadowaniu jako moduł Apache :)
Ja͢ck
@Jack: Argh, not Apache Module, FCGI;)
hakre
Do tej pory próbowałem phpbrew i php-version, ale wydaje się, że oba nie potrafią skompilować PHP.
niezły tyłek

Odpowiedzi:

17

Jednym ze sposobów jest skonfigurowanie głównej wersji php za pomocą mod_php i uruchomienie wszystkich innych przez szybkie cgi na różnych portach (tj. 81, 82, 83 itd.). Nie gwarantuje to jednak całkowicie spójnego zachowania.

Dana the Sane
źródło
32
Pomysł: dla PHP 5.2.1 użyj portu 10521. Dla 5.0.0 użyj 10500 :)
Wayne
2
Inną opcją byłoby uruchomienie go przy użyciu CGI (lub FastCGI) pod różnymi ścieżkami - np. / Cgi500 /, / cgi528 /, ...
Gray Panther
Jeśli korzystasz z Debiana i chcesz używać pakietów, polecam użycie debootstrap do stworzenia systemu chroot, który przechowuje twoją wersję PHP, a następnie skonfiguruj Apache w systemie chroot.
Max Tsepkov
23

Z CentOS możesz to zrobić używając kombinacji fastcgi dla jednej wersji PHP i php-fpm dla drugiej, jak opisano tutaj:

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

Oparty na CentOS 5.6, tylko dla Apache

1. Włącz repozytorium rpmforge i epel yum

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. Zainstaluj php-5.1

Seria CentOS / RHEL 5.x ma php-5.1 w pudełku, po prostu zainstaluj go z yum, np:

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

3. Skompiluj i zainstaluj php 5.2 i 5.3 ze źródła

Dla php 5.2 i 5.3 możemy znaleźć wiele pakietów rpm w Internecie. Jednak wszystkie one kolidują z php, który jest dostarczany z CentOS, więc lepiej skompilujmy je i zainstalujemy z serwera, nie jest to trudne, chodzi o to, aby zainstalować php w innej lokalizacji.

Jednak podczas instalowania php jako modułu apache możemy używać tylko jednej wersji php w tym samym czasie. Jeśli potrzebujemy uruchomić różne wersje php na tym samym serwerze, w tym samym czasie, na przykład, inny wirtualny host może potrzebować innej wersji php. Na szczęście fajne FastCGI i PHP-FPM mogą pomóc.

Skompiluj i zainstaluj php-5.2 z włączonym fastcgi

1) Zainstaluj wymagane pakiety deweloperskie

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

2) Skompiluj i zainstaluj

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) utwórz skrypt pakujący fastcgi

utwórz plik /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/

Skonfiguruj php-fpm

Edytuj /etc/php53/php-fpm.conf, zmień niektóre ustawienia. Ten krok służy głównie do odkomentowania niektórych ustawień, możesz dostosować wartość, jeśli chcesz.

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

Następnie zacznij fpm

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

Zainstaluj i skonfiguruj 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

Skonfiguruj i przetestuj wirtualne hosty

1) Dodaj następujący wiersz do / etc / hosts

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

2) Utwórz katalog główny dokumentu sieciowego i upuść pod nim plik index.php, aby pokazać phpinfo przełączenie na użytkownika root, uruchom

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

Uwaga: pusty katalog / var / www / fcgi-bin jest wymagany, NIE USUWAJ GO PÓŹNIEJ

3) Utwórz plik konfiguracyjny Apache (dołącz do httpd.conf)

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) zrestartuj Apache. odwiedź 3 strony, aby wyświetlić phpinfo i zweryfikować wynik. to znaczy:

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

Jeśli wszystko jest w porządku, możesz użyć jednego z 3 hostów wirtualnych jako szablonu do utworzenia nowego hosta wirtualnego z żądaną wersją php.

tntu
źródło
1
Jest to jednak odpowiedź tylko na link. Prosimy o podanie odpowiednich informacji w odpowiedzi, zamiast polegać w całości na innej witrynie. Linki mają irytujący problem polegający na tym, że mogą zniknąć, przez co SO nadal nie zawiera odpowiednich informacji.
Maarten Bodewes
Możesz zajrzeć do CloudLinux. Jest to płatne rozwiązanie, ale ma akceptowalną cenę.
transilvlad
1
Poprawna odpowiedź! Oto to samo rozwiązanie dla Ubuntu: howtoforge.com/…
Tobias Gaertner
10

Posiadanie wielu instancji apache + php nigdy nie spodobało mi się, ale to prawdopodobnie najłatwiejszy sposób na zrobienie tego. Jeśli nie czujesz się jak KISS ... oto pomysł.

Uruchom swój apache i spróbuj go skonfigurować tak, jak debian i ubuntu, zrób to, np. Mają katalogi dla załadowanych modułów. Twój conf apache może używać takich linii:

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

Następnie skompiluj swoją pierwszą wersję php i nadaj jej prefiks, który ma wyraźnie zawarty numer wersji, np. /Usr/local/php/5.2.8, /usr/local/php/5.2.6 ...

Konfiguracja / ładowanie wyglądałaby mniej więcej tak:

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

Aby zmienić wersje, wszystko co musisz zrobić, to zmienić pliki load i conf z katalogu, w którym apache włącza pliki dla innej wersji. Możesz to zautomatyzować za pomocą prostego skryptu bash (usuń rzeczywisty plik, skopiuj plik wersji alternatywnych w miejscu i zrestartuj apache.

Jedną z zalet tej konfiguracji jest to, że wszystko jest zgodne, tak długo, jak długo zachowujesz ten sam plik php.ini pod względem opcji i modułów (co i tak musiałbyś zrobić z CGI). Wszyscy przechodzą przez SAPI. Twoje aplikacje nie będą wymagać żadnych zmian ani używać względnych adresów URL.

Myślę, że to powinno zadziałać, ale z drugiej strony, nie próbowałem tego ani prawdopodobnie nie zrobię tego, ponieważ nie mam takich samych wymagań jak Ty. Jeśli jednak kiedykolwiek spróbujesz, skomentuj.

Leprechaun
źródło
8

Uwaga: Poniższa metoda będzie działać w systemie Windows.

Alternatywną metodą (jeśli można jednocześnie uruchamiać pojedynczą wersję PHP) jest zdefiniowanie wielu usług Apache, z których każda będzie używać innej wersji PHP.

Przede wszystkim warunki użytkowania w pliku konfiguracyjnym Apache:

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

Teraz za pomocą httpd.exe utwórz dwie oddzielne usługi z wiersza poleceń (z uprawnieniami administratora):

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

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

Teraz możesz uruchomić jedną z powyższych usług na raz (należy zamknąć jedną przed uruchomieniem drugiej).

Jeśli wcześniej zainstalowałeś Apache jako usługę, możesz to usunąć za pomocą poniższego polecenia (zastąp nazwę usługi tą, której użyłeś):

apache -k uninstall -n Apache224

Kolejną uwagą jest to, że osobiście używam „programu z ikonami obszaru powiadomień” o nazwie „Seobiseu” do uruchamiania i zatrzymywania usług w razie potrzeby. Dodałem do niego dwie powyższe usługi.

wmac
źródło
To naprawdę bardzo sprytne rozwiązanie. Jeśli chcesz uruchamiać wiele usług równolegle, możesz uwzględnić odpowiednio Listen 80i Listen 81w każdej z nich ifdefine.
caiosm1005
Niezły pomysł, ale pytanie dotyczy serwera LAMP, a nie serwera WAMP.
Vinicius Monteiro
4

Rozumiejąc, że prawdopodobnie mówisz o komputerze lokalnym / stacjonarnym i prawdopodobnie chciałbyś nadal mówić o komputerze lokalnym / stacjonarnym, przedstawię Ci alternatywę, na wypadek gdyby mogła pomóc tobie lub komuś innemu:

Skonfiguruj wiele instancji serwera wirtualnego w chmurze i udostępnij swój kod między nimi jako repozytorium git (lub jak sądzę mercurial, chociaż nie mam osobistego doświadczenia, wszystko, czego naprawdę potrzebujesz, to coś zdecentralizowanego). Ma to tę zaletę, że daje Ci jak najbliższe doświadczenie produkcyjne, a jeśli masz doświadczenie w konfigurowaniu serwerów, nie jest to takie skomplikowane (lub drogie, jeśli chcesz tylko uruchomić serwer, zrób to, co musisz zrobić, następnie ponownie zakręć, a potem mówisz o kilku centach do powiedzmy 50 centów, do kilku dolców, jeśli po prostu zostawisz ją uruchomioną).

Obecnie opracowuję wszystkie projekty w chmurze i wydaje mi się, że zarządzanie infrastrukturą jest o wiele prostsze niż kiedykolwiek podczas korzystania z instalacji lokalnych / niezwirtualizowanych, co sprawia, że ​​tego rodzaju scenariusz równoległy jest dość bezpośredni. Chciałem tylko wyrzucić ten pomysł, gdybyś go nie rozważył.

Jason
źródło
3

Właśnie pomyślnie obniżyłem wersję PHP5.3 na Ubuntu 10.

Aby to zrobić, użyłem następującego skryptu:

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

Dla każdego, kto nie wie, jak uruchamiać skrypty z wiersza poleceń, oto krótki samouczek:

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

Tych 6 kroków tworzy skrypt w folderze o nazwie „bin” w Twoim katalogu domowym. Następnie możesz uruchomić ten skrypt, wywołując następujące polecenie:

~/bin/myscriptname.sh

Oulia!

Mam nadzieję, że to pomoże niektórym z was!

Dla porównania, tutaj mam skrypt: PHP5.2.10 dla Ubuntu 10

Jest tam kilka osób, które potwierdzają, że to działa i było dla mnie przyjemnością.

Tisch
źródło
dobry skrypt, chociaż karmic nie działał na mnie, ponieważ byłem na Power PC. Właśnie użyłem skryptu, aby usunąć moją bieżącą instalację, a następnie ręcznie zbudowałem 2.14
Jason
2

Rasmus Lerdorf, który stworzył PHP, utrzymuje aktywne rozwiązanie Vagrant, które wydaje się spełniać Twoje potrzeby. Pozwala na szybkie przełączanie się między wersjami PHP, obsługując obecnie ponad 20 różnych wersji. Wychodzi z pudełka z serwerem nginx, ale można go łatwo przełączyć na apache2 z wstępnie skonfigurowanym ustawieniem. Obsługuje również MySQL po wyjęciu z pudełka.

W ten sposób będziesz mieć dostęp do wszystkich wersji PHP, które można wdrożyć na dwóch głównych serwerach internetowych, w ładnym pudełku z włóczęgą, utrzymywanym przez wielkiego człowieka stojącego za PHP.

Aby uzyskać więcej informacji, chciałbym odnieść się do przemówienia wygłoszonego przez p. Lerdorf pod adresem https://youtu.be/6XnysJAyThs?t=2864

Repozytorium github zawierające rozwiązanie Vagrant znajduje się pod adresem https://github.com/rlerdorf/php7dev

Figidon
źródło
To prawdopodobnie IMHO, „najlepsza” odpowiedź - inna maszyna wirtualna dla każdej wersji (ale czy można uruchomić wiele wersji na jednym adresie IP?). Ale jak ironiczne, że twórca php powinien to zrobić - największą wadą php musi być brak kompatybilności między wersjami, co sprawia, że ​​na przykład Joomla jest niemal bezużyteczna.
EML
0

Mam kilka projektów uruchomionych na moim pudełku. Jeśli zainstalowałeś już więcej niż jedną wersję, ten skrypt bash powinien pomóc ci łatwo się przełączyć. W tej chwili mam php5, php5.6 i php7.0, które często przełączam się tam iz powrotem w zależności od projektu, nad którym pracuję. Oto mój kod.

Zapraszam do kopiowania. Upewnij się, że rozumiesz, jak działa kod. To jest dla webhostin. moje lokalne pudełko moje mody są przechowywane w / etc / apache2 / mods-enabled /

    #!/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
Warcząca pchła
źródło
0

Do testów po prostu uruchamiam wiele instancji httpd na różnych adresach IP, więc mam php7 działające na 192.168.0.70 i php5.6 działające na 192.168.0.56. W produkcji mam witrynę ze starym systemem oscommerce z php5.3 i po prostu mam inny plik konfiguracyjny dla tej witryny

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

To także czysty sposób na posiadanie różnych php.iniplików dla różnych witryn. Jeśli masz tylko kilka witryn, to dobry sposób na utrzymanie porządku i nie musisz martwić się o więcej niż jedną witrynę naraz, gdy coś aktualizujesz

Danial
źródło