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


81

PHP5.0.0やPHP5.2.8などの複数のバージョンのPHP5.xを使用してPHPアプリケーションをテストする必要があります。

複数のバージョンのPHP5でアプリケーションをすばやくテストできるように開発LAMPサーバーを構成する方法はありますか?


PATH変数を使用できるはずですが、私は100%ではないので、担当者には回答していません
Malfist 2009

ISPConfig 3(Ubuntu 12.10)で複数のPHPバージョン(PHP-FPMおよびFastCGI)を使用する方法-@ hek2mgl:開発ツールに関する質問はトピックから外れていません。
hakre 2013年

にくい:) Apacheモジュールとしてロードされたときに複数のバージョンが相互に影響を与えることにそれを作るだろうFPMを使用して、合意@hakre
ジャック・

@ジャック:ああ、Apacheモジュールではなく、FCGI;)
hakre 2013年

これまでphpbrewphp-versionを試しましたが、どちらもPHPのコンパイルに失敗しているようです。
素敵なお尻

回答:


17

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


32
アイデア:PHP 5.2.1の場合は、ポート10521を使用します。5.0.0の場合は、10500を使用します:)
Wayne

2
他のオプションは、異なるパスでCGI(またはFastCGI)を使用して実行することです-つまり、/ cgi500 /、/ cgi528 /、...
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およびepelyumリポジトリを有効にします

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.ソースからphp5.2および5.3をコンパイルしてインストールします

php 5.2および5.3の場合、インターネット上で多くのrpmパッケージを見つけることができます。ただし、これらはすべてCentOSに付属のphpと競合するため、ソースからビルドしてインストールすることをお勧めします。これは難しくありません。ポイントは、phpを別の場所にインストールすることです。

ただし、phpをApacheモジュールとしてインストールする場合、同時に使用できる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

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


1
ただし、これはリンクのみの回答です。他のサイトに完全に依存するのではなく、関連する詳細を回答に含めてください。リンクには、リンクが消える可能性があるという厄介な問題があります。このように、SOにはまだ関連情報が含まれていません。
Maarten Bodewes 2014年

CloudLinuxを調べたいと思うかもしれません。これは有料のソリューションですが、許容できる価格です。
transilvlad 2015

1
正しい答え!Ubuntuの同じソリューションは次のとおり
Tobias Gaertner

10

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

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

私が考えて、これは動作するはずですが、その後、再び、私はそれを試していない、また私はあなたと同じ要件を持っていないと私はおそらくそうしています。試したことがあればコメントしてください。


8

注:次の方法はWindowsで機能します。

別の方法(一度に1つのバージョンの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

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

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

apache -k uninstall -n Apache224

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


これは実際には非常にスマートなソリューションです。複数のサービスを並行して実行する場合は、それぞれにListen 80Listen 81を含めることができますifdefine
caiosm1005 2015

いい考えですが、問題はWAMPサーバーではなくLAMPサーバーに関するものです。
ヴィニシウスモンテイロ2016年

4

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

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

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


3

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

オウリア!

これがあなたの何人かを助けることを願っています!

参考までに、ここでスクリプトを入手しました: Ubuntu10用のPHP5.2.10

そこには何人かの人々がこれがうまくいくことを確認していて、それは私にとっておもてなしをしました。


私はPowerPCを使用していたため、カルマは機能しませんでしたが、良いスクリプトです。スクリプトを使用して現在のインストールを削除し、手動でビルドした2.14
Jason

2

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

このようにして、PHPの背後にいる大物によって維持されている素敵なvagrantボックスで、2つのメインWebサーバーにデプロイ可能なPHPのすべてのバージョンにアクセスできます。

詳しくは、氏の講演を参考にしたいと思います。ラードルフ(https://youtu.be/6XnysJAyThs?t=2864)

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


これはおそらく、私見、「最良の」答えです-バージョンごとに異なるVMです(ただし、1つのIPアドレスで複数のバージョンを実行できますか?)。しかし、phpの作成者がこれを行う必要があるのは皮肉なことです-phpの最大の欠陥は、バージョン間の互換性の欠如である必要があります。これにより、たとえばJoomlaはほとんど役に立たなくなります。
EML 2017

0

ボックスでいくつかのプロジェクトを実行しています。すでに複数のバージョンをインストールしている場合、この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

テストでは、異なる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サイトごとに異なるファイルを作成するためのクリーンな方法でもあります。物事を整理するための優れた方法であり、何かをアップグレードするときに一度に1つ以上のサイトについて心配する必要がない場合は、サイトが2つしかない場合

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.