개발 LAMP 서버에서 여러 버전의 PHP 5.x를 어떻게 실행할 수 있습니까?


81

PHP 5.0.0 및 PHP 5.2.8과 같은 여러 버전의 PHP 5.x로 PHP 애플리케이션을 테스트해야합니다.

여러 버전의 PHP5로 애플리케이션을 빠르게 테스트 할 수 있도록 개발 LAMP 서버를 구성 할 수있는 방법이 있습니까?


PATH 변수를 사용할 수 있어야하지만 100 %가 아니므로 담당자에 대해 대답하지 않습니다
Malfist

ISPConfig 3 (Ubuntu 12.10)에서 여러 PHP 버전 (PHP-FPM 및 FastCGI)을 사용하는 방법 -@ hek2mgl : 개발 도구에 대한 질문은 주제를 벗어난 것이 아닙니다.
hakre

@hakre 동의, FPM을 사용하면 Apache 모듈로로드 될 때 여러 버전이 서로 영향을 줄 가능성이 낮아집니다. :)
Ja͢ck

@Jack : Argh, not Apache Module, FCGI;)
hakre

지금까지 phpbrewphp-version을 시도 했지만 둘 다 PHP를 컴파일하지 못하는 것 같습니다.
멋진 엉덩이

답변:


17

이를 수행하는 한 가지 방법은 mod_php로 기본 버전의 php를 설정하고 다른 포트 (예 : 81, 82, 83 등)에서 빠른 cgi를 통해 다른 모든 버전을 실행하는 것입니다. 그래도 완전히 일관된 동작을 보장하지는 않습니다.


32
아이디어 : PHP 5.2.1의 경우 포트 10521을 사용하십시오. 5.0.0의 경우 10500을 사용하십시오. :)
Wayne

2
다른 옵션은 다른 경로 (예 : / cgi500 /, / cgi528 /, ...)에서 CGI (또는 FastCGI)를 사용하여 실행하는 것입니다.
Gray Panther

Debian을 사용 중이고 패키징을 사용하려는 경우 debootstrap을 사용하여 PHP 버전을 보유하는 chroot 시스템을 만든 다음 chroot 시스템 내부에 Apache를 구성하는 것이 좋습니다.
Max Tsepkov 2014 년

23

CentOS를 사용하면 여기에 설명 된대로 한 버전의 PHP에 대해 fastcgi를 사용하고 다른 버전에 대해 php-fpm을 조합하여 수행 할 수 있습니다.

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

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와 충돌하므로 소스에서 빌드하고 설치하는 것이 좋습니다. 이것은 어렵지 않습니다. 요점은 PHP를 다른 위치에 설치하는 것입니다.

그러나 php를 아파치 모듈로 설치하면 동시에 한 버전의 php 만 사용할 수 있습니다. 예를 들어 동일한 서버에서 다른 버전의 php를 동시에 실행해야하는 경우, 예를 들어 다른 가상 호스트에는 다른 버전의 php가 필요할 수 있습니다. 다행히도 멋진 FastCGI와 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 래퍼 스크립트 생성

/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 구성

/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) 웹 문서 루트를 생성하고 그 아래에 index.php를 드롭하여 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) 아파치를 다시 시작하십시오. phpinfo를보고 결과를 확인하려면 세 사이트를 정중하게 방문하십시오. 즉 :

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

모두 정상이면 3 개의 가상 호스트 중 하나를 템플릿으로 사용하여 원하는 PHP 버전으로 새 가상 호스트를 만들 수 있습니다.


1
그러나 이것은 링크 전용 답변입니다. 다른 사이트에 완전히 의존하는 대신 관련 세부 정보를 답변에 포함하십시오. 링크는 사라질 수있는 성가신 문제가 있으며, 이렇게하면 여전히 관련 정보가 포함되지 않습니다.
Maarten Bodewes 2014

CloudLinux를 살펴볼 수 있습니다. 유료 솔루션이지만 합리적인 가격입니다.
transilvlad

1
올바른 대답! 다음은 우분투 같은 솔루션입니다 : howtoforge.com/...은
토비아스 GAERTNER

10

apache + php의 여러 인스턴스를 갖는 것은 결코 내 환상을 간지럽 히지 않았지만 아마도 가장 쉬운 방법 일 것입니다. KISS처럼 느껴지지 않는다면 여기에 아이디어가 있습니다.

아파치를 설치하고 실행하고, 데비안과 우분투처럼 구성 해보십시오. 예를 들어로드 된 모듈을위한 디렉토리가 있습니다. 아파치 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 디렉토리에서로드 및 conf 파일을 변경하기 만하면됩니다. 다른 버전의 파일을 포함합니다. 간단한 bash 스크립트로 자동화 할 수 있습니다 (실제 파일 삭제, 대체 버전 파일 복사, 아파치를 다시 시작).

이 설정의 한 가지 장점은 모든 것이 일치한다는 것입니다. php.ini를 옵션과 모듈 측면에서 동일하게 유지하면됩니다 (어쨌든 CGI와 관련이 있음). 그들은 모두 SAPI를 거치고 있습니다. 애플리케이션은 어떠한 변경도 필요하지 않으며 상대 URL을 사용할 필요도 없습니다.

나는 이것이 효과가 있다고 생각 하지만 다시 한번 시도하지 않았으며 당신과 같은 요구 사항이 없기 때문에 그렇게 할 가능성이 없습니다. 그래도 시도한다면 댓글을 달아주세요.


8

참고 : 다음 방법은 Windows에서 작동합니다.

한 번에 단일 버전의 PHP를 실행해도 괜찮은 경우 다른 방법은 각각 다른 PHP 버전을 사용하는 여러 Apache 서비스를 정의하는 것입니다.

먼저 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를 사용하여 명령 줄에서 두 개의 개별 서비스를 만듭니다 (관리자 권한으로 승격 됨).

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

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

이제 위의 서비스 중 하나를 한 번에 시작할 수 있습니다 (다른 서비스를 시작하기 전에 하나를 종료해야 함).

이전에 Apache를 서비스로 설치 한 경우 아래 명령을 사용하여 제거 할 수 있습니다 (서비스 이름을 사용한 이름으로 바꿉니다).

apache -k uninstall -n Apache224

또 한 가지 더 주목할 점은 개인적으로 "서비스"라는 "알림 영역 아이콘 프로그램"을 사용하여 필요에 따라 서비스를 시작하고 중지하는 것입니다. 위의 두 가지 서비스를 추가했습니다.


그것은 실제로 매우 현명한 솔루션입니다. 여러 서비스를 병렬로 실행하려면 각각 Listen 80Listen 81에 각각 포함 할 수 있습니다 ifdefine.
caiosm1005 2015

좋은 생각이지만 질문은 WAMP 서버가 아닌 LAMP 서버에 관한 것입니다.
Vinicius Monteiro

4

아마도 로컬 / 데스크톱 컴퓨터에 대해 이야기하고 있으며 계속 진행할 것임을 이해 로컬 / 데스크탑 머신에 대해 이야기 , 그것이 당신이나 다른 사람에게 도움이 될 수있는 경우를 대비하여 당신을 위해 대안을 던질 것입니다.

클라우드에 여러 가상 서버 인스턴스를 설정하고 이들간에 코드를 git 저장소로 공유합니다 (또는 수은, 개인적 경험이 없지만 실제로 필요한 것은 분산 된 것입니다). 이것은 가능한 한 프로덕션 경험에 가깝게 제공하는 이점이 있으며 서버 설정 경험이 있다면 그렇게 복잡하지 않습니다 (또는 비용이 많이 들고 서버를 가동하려는 경우 필요한 작업을 수행하십시오. 그런 다음 다시 돌리면 몇 센트에서 50 센트까지, 그냥 실행 상태로두면 몇 달러까지).

요즘은 클라우드에서 모든 프로젝트 개발을 수행하고 있으며 로컬 / 비 가상화 설치를 사용할 때보 다 인프라 관리가 훨씬 간단하다는 사실을 알게되었으며 이러한 종류의 병렬 시나리오를 공정하게 만듭니다. 똑바로. 나는 당신이 그것을 고려하지 않았다면 그 아이디어를 거기에 버리고 싶었습니다.


3

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

Oulia!

도움이 되었기를 바랍니다.

참고로 여기에 스크립트가 있습니다. Ubuntu 10 용 PHP5.2.10

거기에 여러 사람이 모두 이것이 효과가 있음을 확인했고 그것은 나를 위해 대접을 받았습니다.


비록 내가 Power PC에 있었기 때문에 karmic이 나를 위해 작동하지 않았지만 좋은 스크립트. 방금 스크립트를 사용하여 현재 설치를 제거한 다음 수동으로 빌드 2.14
Jason

2

PHP를 만든 Rasmus Lerdorf는 귀하의 요구를 해결하는 것처럼 보이는 활성 Vagrant 솔루션을 유지 관리하고 있습니다. 현재 20 개 이상의 다른 버전을 지원하는 PHP 버전 사이를 빠르게 전환 할 수 있습니다. nginx 서버와 함께 기본적으로 제공되지만 미리 구성된 설정을 사용하여 apache2로 쉽게 전환 할 수 있습니다. 또한 기본적으로 MySQL을 지원합니다.

이렇게하면 PHP의 거물이 관리하는 멋진 방랑자 상자에서 두 개의 주요 웹 서버에 배포 할 수있는 모든 버전의 PHP에 액세스 할 수 있습니다.

자세한 내용은 Mr. Lerdorfhttps://youtu.be/6XnysJAyThs?t=2864의

Vagrant 솔루션이 포함 된 github 저장소는 https://github.com/rlerdorf/php7dev 에서 찾을 수 있습니다.


이것은 아마도 IMHO, '최상의'대답-각 버전마다 다른 VM입니다 (하지만 하나의 IP 주소에서 여러 버전을 실행할 수 있습니까?). 그러나 PHP의 제작자가이 작업을 수행해야한다는 것은 얼마나 아이러니 한가? PHP의 가장 큰 결점은 버전 간의 호환성이 없다는 것입니다. 예를 들어 Joomla는 쓸모가 없습니다.
EML

0

내 상자에서 여러 프로젝트를 실행하고 있습니다. 이미 둘 이상의 버전을 설치 한 경우이 bash 스크립트를 사용하면 쉽게 전환 할 수 있습니다. 현재 php5, php5.6 및 php7.0이 있으며 작업중인 프로젝트에 따라 자주 앞뒤로 움직입니다. 다음은 내 코드입니다.

자유롭게 복사하십시오. 코드가 어떻게 작동하는지 이해해야합니다. 이것은 웹 호스팅 용입니다. 내 로컬 박스 내 모드는 / 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

0

테스트를 위해 다른 IP 주소에서 httpd의 여러 인스턴스를 실행하기 때문에 php7은 192.168.0.70에서 실행되고 php5.6은 192.168.0.56에서 실행됩니다. 프로덕션에서는 php5.3을 실행하는 오래된 oscommerce를 실행하는 사이트가 있고 사이트에 대해 다른 conf 파일이 있습니다.

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

또한 php.ini사이트 마다 다른 파일 을 가질 수있는 깨끗한 방법 입니다. 정리 된 상태를 유지하는 좋은 방법이 두 개의 사이트 만 있고 업그레이드 할 때 한 번에 하나 이상의 사이트에 대해 걱정할 필요가없는 경우

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.