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?
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?
Odpowiedzi:
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.
Z CentOS możesz to zrobić używając kombinacji fastcgi dla jednej wersji PHP i php-fpm dla drugiej, jak opisano tutaj:
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
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
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
yum install gcc libxml2-devel bzip2-devel zlib-devel \
curl-devel libmcrypt-devel libjpeg-devel \
libpng-devel gd-devel mysql-devel
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
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.
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.
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.
Listen 80
i Listen 81
w każdej z nich ifdefine
.
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ł.
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ą.
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
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
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.ini
plikó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