web-dev-qa-db-ja.com

開発LAMPサーバーでPHP 5.xの複数のバージョンを実行するにはどうすればよいですか?

PHP 5.0.0やPHP 5.2など、PHP 5.xの複数のバージョンでPHPアプリケーションをテストする必要があります。 8。

開発LAMPサーバーを設定して、PHP5の複数のバージョンでアプリケーションをすばやくテストできる方法はありますか?

81
James Mishra

これを行う1つの方法は、メインバージョンのphpをmod_phpでセットアップし、他のすべてを異なるポート(81、82、83など)で高速cgiを介して実行することです。ただし、これは完全に一貫した動作を保証するものではありません。

17
Dana the Sane

CentOSでは、ここで説明するように、PHPの1つのバージョンではfastcgiを、もう1つのバージョンでは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を別の場所にインストールすることです。

ただし、Apacheモジュールとしてphpをインストールする場合、同時に使用できるphpのバージョンは1つだけです。たとえば、同じサーバー上で異なるバージョンの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)Webドキュメントルートを作成し、その下に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)Apacheを再起動します。 phpinfoを表示して結果を検証するには、3つのサイトを丁寧にご覧ください。すなわち:

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

すべて問題なければ、3つの仮想ホストの1つをテンプレートとして使用して、目的のphpバージョンで新しい仮想ホストを作成できます。

23
transilvlad

Apache + phpの複数のインスタンスを持っていることは、私の好みをくすぐりませんでしたが、おそらく最も簡単な方法です。 KISS ...のように感じない場合は、ここにアイデアがあります。

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が別のバージョンのファイルのインクルードを行うディレクトリからロードファイルとconfファイルを変更するだけです。単純なbashスクリプト(実際のファイルを削除し、代わりのバージョンのファイルを所定の場所にコピーして、Apacheを再起動します)で自動化できます。

このセットアップの利点の1つは、すべてが一致していることです。そのため、オプションとモジュールの点でphp.iniを同じに保つ限り(とにかくCGIで行う必要があります)。それらはすべてSAPIを経由しています。アプリケーションは一切変更する必要も、相対URLを使用する必要もありません。

私は思考これは機能するはずですが、それからまた、私はそれを試したことはありませんし、あなたと同じ要件を持っていないので、そうする可能性もあります。試したことがあればコメントしてください。

10
Leprechaun

注:次の方法は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を使用して、コマンドラインから2つの個別のサービスを作成します(管理者に昇格)。

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

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

これで、上記のサービスのいずれかを一度に開始できます(もう一方を開始する前に一方をシャットダウンする必要があります)。

以前にサービスとしてApacheをインストールしたことがある場合は、以下のコマンドを使用して削除できます(サービス名を使用したものに置き換えます)。

Apache -k uninstall -n Apache224

もう1つの注意点は、個人的に「Seobiseu」という「通知領域アイコンプログラム」を使用して、必要に応じてサービスを開始および停止することです。上記の2つのサービスを追加しました。

8
wmac

あなたはおそらくローカル/デスクトップマシンについて話していると理解し、おそらくcontinueローカル/デスクトップマシンについて話したいと思うので、それが助けになるかもしれない場合に備えて、あなたに代わりを投げますあなたまたは他の誰か:

クラウドに複数の仮想サーバーインスタンスを設定し、それらの間でコードをgitリポジトリとして共有します(またはMercurial、個人的な経験はありませんが、本当に必要なのは分散型のものです)。これには、できる限り実稼働環境に近い利点があり、サーバーのセットアップ経験がある場合はそれほど複雑ではありません(または、サーバーを起動したいだけの場合は、必要なことを行います)。それからもう一度スピンダウンして、数セントから50セントと言っているのです。それをそのままにしておけば数ドルです。

私は最近、すべてのプロジェクト開発をクラウドで行っていますが、ローカル/非仮想化インストールを使用するときよりもインフラストラクチャを管理する方がはるかに簡単であることがわかりました。まっすぐ進む。あなたがそれを考慮していなかった場合、私はそこにアイデアを投げたかっただけです。

4
Jason

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

ウリア!

これがあなたの一部を助けることを願っています!

参考までに、スクリプトを入手した場所を次に示します。 buntu 10の場合PHP5.2.1

そこには何人かがいますが、全員がこれが機能していることを確認しています。

3
Tisch

PHPを作成したRasmus Lerdorfは、あなたのニーズを解決しているように見えるアクティブなVagrantソリューションを維持しています。これはPHPバージョン、現在20以上の異なるバージョンをサポートしています。これはnginxサーバーですぐに使用できますが、事前設定されたApache2に簡単に切り替えることができます。また、すぐにMySQLをサポートします。

これにより、PHPのすべてのバージョンにアクセスできるようになり、2つのメインWebサーバーに展開でき、PHPの背後にいる大物によって管理されているNice vagrant boxに格納されます。

詳細については、mrによる講演を参照したいと思います。 Lerdorf at https://youtu.be/6XnysJAyThs?t=2864

Vagrantソリューションを含むgithubリポジトリは https://github.com/rlerdorf/php7dev にあります

2
Figidon

テストでは、異なるIPアドレスでhttpdの複数のインスタンスを実行するだけなので、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

また、異なるphp.iniさまざまなサイトのファイル。あなたが物事を整理する素敵な方法ならいくつかのサイトがあり、何かをアップグレードするときに一度に1つ以上のサイトを心配する必要はありません

0
Danial

私のボックスでいくつかのプロジェクトを実行しています。すでに複数のバージョンをインストールしている場合は、このbashスクリプトを使用すると簡単に切り替えることができます。現時点では、php5、php5.6、php7.0があり、作業中のプロジェクトに応じて頻繁に切り替えます。これが私のコードです。

気軽にコピーしてください。コードの仕組みを理解していることを確認してください。これはwebhostin用です。私のローカルボックスは私のmodは/ 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
Growling Flea