어떻게 개발 LAMP 서버에서 여러 버전의 PHP 5.x를 실행할 수 있습니까?
PHP 5.0.0 및 PHP 5.2.8과 같은 여러 버전의 PHP 5.x를 사용하여 PHP 애플리케이션을 테스트해야 합니다.
여러 버전의 PHP5로 애플리케이션을 빠르게 테스트할 수 있도록 개발 LAMP 서버를 구성할 수 있는 방법이 있습니까?
CentOS에서는 다음과 같이 PHP의 한 버전에는 fastcgi를, 다른 버전에는 php-fpm을 조합하여 사용할 수 있습니다.
CentOS 5.6을 기반으로 Apache 전용
1. rpmforge 및 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. php-5.1 설치
CentOS/RHEL 5.x 시리즈에는 php-5.1이 동봉되어 있으므로 yum과 함께 설치하기만 하면 됩니다.다음은 예를 제시하겠습니다.
sudo yum install php php-mysql php-mbstring php-mcrypt
3. 소스로부터 php 5.2 및 5.3을 컴파일하여 설치합니다.
php 5.2 및 5.3의 경우 인터넷에서 많은 rpm 패키지를 찾을 수 있습니다.그러나 모두 CentOS에 부속된 php와 충돌하기 때문에 soure에서 빌드하여 설치하는 것이 좋습니다.이것은 어렵지 않습니다.중요한 것은 php를 다른 장소에 설치하는 것입니다.
단, apache 모듈로 php를 설치할 경우 동시에 사용할 수 있는 버전은 1개뿐입니다.예를 들어, 같은 서버에서 다른 버전의 php를 동시에 실행해야 하는 경우, 다른 가상 호스트에는 다른 버전의 php가 필요할 수 있습니다.다행히 쿨한 Fast CGI와 PHP-FPM이 도움이 됩니다.
fastcgi를 활성화하여 php-5.2를 빌드 및 설치합니다.
1) 필요한 개발 패키지 설치
yum install gcc libxml2-devel bzip2-devel zlib-devel \
curl-devel libmcrypt-devel libjpeg-devel \
libpng-devel gd-devel mysql-devel
2) 컴파일 및 설치
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) fastcgi 래퍼 스크립트 작성
create file /usr/local/fcgiwrapper를 지정합니다.쉿
#!/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 구성
/etc/php53/php-fpm.conf를 편집하고 일부 설정을 변경합니다.이 단계는 주로 일부 설정의 코멘트를 해제하기 위한 것으로, 필요에 따라서 값을 조정할 수 있습니다.
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
그럼 fpm을 시작합니다.
sudo /etc/init.d/php-fpm start
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
가상 호스트 설정 및 테스트
1) /etc/hosts에 다음 행을 추가합니다.
127.0.0.1 web1.example.com web2.example.com web3.example.com
2) 웹 문서 root을 만들고 그 아래에 index.php를 드롭하여 사용자 root에 대한 phpinfo 스위치를 표시하고 실행합니다.
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
주의: 빈 /var/www/fcgi-bin 디렉토리가 필요합니다.나중에 삭제하지 말아 주세요.
3) Apache 설정 파일 생성(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) Apache를 재시작합니다.3개의 사이트를 각각 방문하여 phpinfo를 확인하고 결과를 검증합니다.즉,
http://web1.example.com
http://web2.example.com
http://web3.example.com
모든 것이 정상인 경우 3개의 가상 호스트 중 하나를 템플릿으로 사용하여 원하는 php 버전을 사용하여 새 가상 호스트를 만들 수 있습니다.
이를 위한 한 가지 방법은 mod_php를 사용하여 메인 버전의 php를 설정하고 다른 모든 것을 다른 포트(81, 82, 83 등)에서 고속 cgi를 통해 실행하는 것입니다.하지만 이것이 완전히 일관된 행동을 보장하지는 않습니다.
Apache + php 인스턴스가 여러 개 있는 것은 결코 내 마음에 들지 않지만, 아마도 가장 쉬운 방법일 것이다.만약 당신이 키스하고 싶지 않다면... 좋은 생각이 있어요.
apache를 셋업하여 실행시키고 debian 및 ubuntu와 같이 설정해 보십시오.예를 들어 로드된 모듈용 디렉토리가 있습니다.Apache conf에는 다음과 같은 행을 사용할 수 있습니다.
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
그런 다음 첫 번째 버전의 php를 작성하고 버전 번호가 명시적으로 포함된 프레픽스를 지정합니다.예를 들어 /usr/local/php/5.2.8, /usr/local/php/5.2.6...
conf/load는 다음과 같습니다.
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
버전을 전환하려면 apache 디렉토리에서 load 및 conf 파일을 변경하면 됩니다.이 파일은 다른 버전의 파일에 대해 include on이 됩니다.간단한 bash 스크립트를 사용하여 이를 자동화할 수 있습니다(실제 파일 삭제, 대체 버전 파일 복사, Apache 재시작).
이 셋업의 장점 중 하나는 모든 것이 동의한다는 것입니다.따라서 옵션과 모듈(어차피 CGI와 함께 해야 하는 것)에 관해서는 php.ini를 그대로 유지할 수 있습니다.모두 SAPI를 거치고 있습니다.어플리케이션에는 변경이 전혀 필요하지 않으며 상대 URL을 사용할 필요도 없습니다.
저는 이것이 효과가 있을 것이라고 생각합니다만, 저는 아직 시도하지 않았고, 당신과 같은 요건이 아니기 때문에 그렇게 할 것 같지도 않습니다.그래도 시도한다면 코멘트를 하세요.
주의: 다음 방법은 Windows에서 사용할 수 있습니다.
다른 방법(한 번에 하나의 PHP 버전을 실행해도 괜찮은 경우)은 여러 Apache 서비스를 정의하는 것입니다.이러한 서비스는 각각 다른 PHP 버전을 사용합니다.
먼저 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>
이제 httpd를 사용합니다.exe는 명령줄에서2개의 개별 서비스를 만듭니다(관리자에게 통지합니다).
httpd.exe -k install -n Apache224_php54 -D php54
httpd.exe -k install -n Apache224_php55 -D php55
이제 위의 서비스 중 하나를 한 번에 시작할 수 있습니다(다른 서비스를 시작하기 전에 하나를 종료해야 합니다).
이전에 Apache를 서비스로 설치한 경우 다음 명령을 사용하여 해당 Apache를 제거할 수 있습니다(서비스 이름을 사용한 이름으로 바꿉니다).
apache -k uninstall -n Apache224
한 가지 더 말씀드리자면, 저는 개인적으로 '서비세'라는 '알림 영역 아이콘 프로그램'을 사용하여 필요에 따라 서비스를 시작 및 중지하고 있습니다.위의 두 가지 서비스를 추가했습니다.
로컬/데스크탑 머신에 대해 이야기하고 있을 가능성이 높기 때문에 로컬/데스크탑 머신에 대해 계속 이야기하고 싶다고 생각하고 있는 것을 이해하면, 고객이나 다른 사람에게 도움이 될 수 있는 경우에 대비해서, 다음과 같은 대안을 제시하겠습니다.
클라우드에서 여러 가상 서버 인스턴스를 설정하고 git 저장소로 코드를 공유합니다(또는 개인 경험은 없지만 분산형 서버만 있으면 됩니다).이것은 가능한 한 실가동 환경에 가까운 경험을 얻을 수 있는 이점이 있습니다.서버를 셋업한 경험이 있는 경우는, 그다지 복잡하지 않습니다(또는 고비용입니다만, 서버를 스핀업 해, 필요한 작업을 실시해, 다시 스핀 다운 하고 싶은 경우는, 몇센트가 되어, 50센트가 되어 버립니다.실행 상태를 유지하십시오).
요즘은 클라우드에서 프로젝트 개발을 모두 수행하고 있습니다.로컬/비가상화 설치를 사용하는 경우보다 인프라스트럭처 관리가 훨씬 간단하다는 것을 알게 되었습니다.이러한 종류의 병렬 시나리오가 매우 간단합니다.당신이 고려하지 않았다면 그냥 그 아이디어를 던져버리고 싶었어요.
방금 Ubuntu 10의 PHP5.3에서 다운그레이드에 성공했습니다.
이를 위해 다음 스크립트를 사용했습니다.
#! /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
명령줄에서 스크립트를 실행하는 방법을 모르는 사용자를 위해 다음과 같은 간단한 튜토리얼을 제공합니다.
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
이 6단계는 홈 디렉토리의 "bin" 폴더에 스크립트를 작성합니다.그런 다음 다음 명령을 호출하여 이 스크립트를 실행할 수 있습니다.
~/bin/myscriptname.sh
울리아!
여러분 중 몇 명에게 도움이 되길 바랍니다!
참고로 Ubuntu 10용 PHP5.2.10 스크립트를 입수했습니다.
그 위에 있는 몇몇 사람들이 이게 효과가 있다는 걸 확인하고 있어요. 그리고 제게는 큰 도움이 되었어요.
PHP를 만든 Rasmus Lerdorf는 당신의 요구를 해결하는 것처럼 보이는 액티브 Vagrant 솔루션을 유지하고 있습니다.현재 20개 이상의 다른 버전을 지원하는 PHP 버전 간에 빠르게 전환할 수 있습니다.nginx 서버와 함께 제공되지만 미리 구성된 설정으로 쉽게 apache2로 전환할 수 있습니다.또한 개봉 즉시 MySQL을 지원합니다.
이렇게 하면 모든 버전의 PHP에 액세스할 수 있으며, 두 개의 메인 웹 서버에 배포 가능하며, 멋진 vagrant 박스에서 PHP의 배후에 있는 거물급에 의해 관리됩니다.
자세한 것은, Mr.의 이야기를 참조해 주세요.Lerdorf (https://youtu.be/6XnysJAyThs?t=2864 )
Vagrant 솔루션을 포함하는 github 저장소는 https://github.com/rlerdorf/php7dev에서 찾을 수 있습니다.
내 박스 위에 몇 가지 프로젝트가 있습니다.이미 여러 버전을 설치한 경우 이 bash 스크립트를 사용하면 쉽게 전환할 수 있습니다.현재 php5, php5.6, php7.0을 가지고 있으며, 작업 중인 프로젝트에 따라 자주 왔다 갔다 합니다.여기 제 코드가 있습니다.
자유롭게 복사하세요.코드가 어떻게 작동하는지 이해해야 합니다.이것은 webhostin용입니다.로컬 박스의 mods는 /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
테스트를 위해 httpd의 여러 인스턴스를 서로 다른 IP 주소로 실행하면 됩니다.따라서 192.168.0.70에서 php7을 실행하고 192.168.0.56에서 php5.6을 실행하고 있습니다.프로덕션에서 php5.3을 실행하는 오래된 oscommerce를 실행하는 사이트가 있으며 사이트용으로 다른 conf 파일을 가지고 있을 뿐입니다.
httpd -f /etc/apache2/php70.conf
httpd -f /etc/apache2/php53.conf
한른른른른 it it it른 it it it it it it it it it it it it 。php.ini른른른른를 가지고 경우, 할 수 있는 이 있다면, 할때 한 에 두 개할 필요가 없습니다.
언급URL : https://stackoverflow.com/questions/524508/how-can-one-run-multiple-versions-of-php-5-x-on-a-development-lamp-server
'source' 카테고리의 다른 글
| Java에서 정적 메서드를 덮어쓰고 오버로드할 수 있습니까? (0) | 2022.10.22 |
|---|---|
| 컬렉션여러 필드로 정렬하다 (0) | 2022.10.22 |
| virtualenv와 pyenv의 관계는 무엇입니까? (0) | 2022.10.22 |
| JavaScript에서 문자열을 변수 이름으로 변환 (0) | 2022.10.22 |
| vuefity 변환 v-text-field 레이블 (0) | 2022.10.22 |