XAMPPで複数のPHPを切り替える


プロジェクト毎にPHPを切り替えてみる

いくつものプロジェクトに携わって行くと、開発環境がそれぞれ異なることがよく起こります。
今回は、複数のバージョンのPHPを一つのXAMPP環境にインストールして切り替えて使用する方法を試したいと思います。

基本方針

現時点では、運用中のXAMPPが存在しています。
この環境にできるだけ手を入れないで、PHPのバージョンを追加する方法を模索したいと思います。

筆者のPCには、以前に行ったXAMPPのインストール作業のおかげで、Apacheやコマンドラインから起動できるPHPが存在しています。これはいろいろな設定が、XAMPPのインストールフォルダの下にあるphpフォルダにパスが通されていることを物語っています。
であるならば、各種アプリケーションの設定ファイルや環境変数のpathを変更しないで済む方法にします。目的のバージョンのPHPがphpフォルダで参照できるように「シンボリックリンク」を張ることにします。
※シンボリックリンク(mklinkコマンドで作成)はショートカットとは異なり、アプリケーションから見るとその実態と全く同じに見えます。(ショートカットは、ファイルにしか見えません。)

目的のPHPをインストール

まずは目的のバージョンのPHPをインストールします。
PHPの公式サイトからWindows版バイナリーのダウンロードページへ進み、目的のバージョンのZipファイルをダウンロードします。
ダウンロードしたZipファイルを解凍して、XAMPPのPHPと同じフォルダに専用のフォルダ名でコピーします。
ここでは、C:¥xamppにXAMPPがインストールされており、C:¥xampp¥phpにPHP 5.4.31がインストールされているものとします。
また、ダウンロードしたZipファイルは、C:¥xamppphp-7.1.4というフォルダに解答しました。
そして、XAMPPに付属してインストールされているPHPのフォルダ名をphp-5.4.31に変更します。
※ここでは、各バージョンのPHPのフォルダ名をphp-<メジャーバージョン>.<マイナーバージョン>.<リビジョン>としています。
これで、シンボリックリンクを張る準備が出来ました。

PHPを切り替える

PHPを切り替えるには、目的のバージョンがインストールされたフォルダにphpフォルダで参照できるようにシンボリックリンクを張ります。シンボリックリンクの作成には、mklinkを使います。また、フォルダのシンボリックリンクの削除には、rmdirを使います。
ですので、次のようにすることで、PHPを切り替えることが出来ます。

rmdir C:¥xampp¥php
mklink /D C:¥xampp¥php C:¥xampp¥php-<メジャーバージョン>.<マイナーバージョン>.<リビジョン>

Apache の設定ファイル

基本的には以上で問題ないのですが、PHPのメジャーバージョンが変わると、Apacheが参照するファイル名が変わってしまいます。この変更を吸収するために、設定ファイルに手を入れることにします。
Apacheの設定ファイルは、XAMPPがインストールされたフォルダの下のapache¥confにあります。
今回手を入れる必要がある設定ファイルは、apache¥conf¥extra¥httpd-xampp.confです。
このファイルの14行目あたりかから、PHPに関する設定が記述されています。
このPHPに関する設定をPHPのバージョンに合わせて書き換えればよいのですが、PHPを切り替える度に設定ファイルを書き換えることは現実的ではありません。そこで、別ファイルに記述されたApacheの設定ファイルを読み込むIncludeディレクティブを使って切り替える方法を使います。
ここでも、シンボリックリンクを利用します。
バージョン毎に作成した設定ファイルを用意しておき、apache¥conf¥extra¥httpd-xampp.confでは、シンボリックリンクを指定して設定を読み込むようにします。
具体的には、

#
# PHP-Module setup
#
LoadFile "C:/xampp/php/php5ts.dll"
LoadFile "C:/xampp/php/libpq.dll"
LoadModule php5_module "C:/xampp/php/php5apache2_4.dll"

<FilesMatch "¥.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "¥.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

#
# PHP-CGI setup
#
#<FilesMatch "¥.php$">
#    SetHandler application/x-httpd-php-cgi
#</FilesMatch>
#<IfModule actions_module>
#    Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe"
#</IfModule>


<IfModule php5_module>
    PHPINIDir "C:/xampp/php"
</IfModule>

httpd-xampp-php54.confに移動して、以下のように変更します。

Include "conf/extra/httpd-xampp-php.conf"

※ファイル名はhttpd-xampp-php<メジャーバージョン><マイナーバージョン>.confとしています。マイナーバージョンはなくてもよいかもしれませんが、念のためつけています。
従ってPHPを切り替える際に、次の操作を合わせて行います。

del C:¥xampp¥apache¥conf¥extra¥httpd-xampp-php.conf
mklink C:¥xampp¥apache¥conf¥extra¥httpd-xampp-php.conf C:¥xampp¥apache¥conf¥extra¥httpd-xampp-php<メジャーバージョン><マイナーバージョン>.conf

スクリプト化

これらの操作を、PHPを切り替える度に行うのは面倒です。また、現在どのバージョンが有効になっているのか、永遠に記憶していることもできません。
そこで、スクリプトにしてしまいましょう。

@echo off

echo.
echo Change the version of PHP to use.
echo.
php -v
echo.
echo 1: PHP 5.4.31
echo 2: PHP 7.1.4
echo C: Cancel
echo.

choice /c 12C /M "Choose the version of PHP."
if %errorlevel% equ 1 goto PHP_5_4_31
if %errorlevel% equ 2 goto PHP_7_1_4
goto OnExit

:PHP_5_4_31
del C:¥xampp¥apache¥conf¥extra¥httpd-xampp-php.conf
mklink C:¥xampp¥apache¥conf¥extra¥httpd-xampp-php.conf C:¥xampp¥apache¥conf¥extra¥httpd-xampp-php54.conf
rmdir C:¥xampp¥php
mklink /D C:¥xampp¥php C:¥xampp¥php-5.4.31
goto OnExit

:PHP_7_1_4
del C:¥xampp¥apache¥conf¥extra¥httpd-xampp-php.conf
mklink C:¥xampp¥apache¥conf¥extra¥httpd-xampp-php.conf C:¥xampp¥apache¥conf¥extra¥httpd-xampp-php71.conf
rmdir C:¥xampp¥php
mklink /D C:¥xampp¥php C:¥xampp¥php-7.1.4
goto OnExit

:OnExit

6行目で現在のPHPバージョンを表示させています。
13行目でキー入力を待ちます。
14~16行目で入力されたキーを判断して分岐します。
以降で、先に紹介した処理を行っています。
実行すると、次のようになります。

Change the version of PHP to use.

PHP 7.1.4 (cli) (built: Apr 11 2017 20:08:12) ( ZTS MSVC14 (Visual C++ 2015) x86 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

1: PHP 5.4.31
2: PHP 7.1.4
C: Cancel

Choose the version of PHP. [1,2,C]?1
C:¥xampp¥apache¥conf¥extra¥httpd-xampp-php.conf <<===>> C:¥xampp¥apache¥conf¥extra¥httpd-xampp-php54.conf のシンボリック リンクが作 成されました
C:¥xampp¥php <<===>> C:¥xampp¥php-5.4.31 のシンボリ ック リンクが作成されました

C:¥WINDOWS¥system32>

最後に

mklinkコマンドは管理者権限が必要なコマンドです。 そのため、このスクリプトを実行するのにも管理者権限が必要になります。
コマンドプロンプトを開く際に、管理者権限で開いてから実行してください。

追記(2017-09-07)

PHPのバージョンを7.1.7に変更してXAMMP Control PanelからApacheをStartすると、php_curl.dll と php_openssl.dll が見つからないとエラーが出るようになってしまいました。5.4.31に戻すと普通にStartします。
extフォルダにはこれらのファイルが存在しているのにエラーが出てしまいます。
このエラーは、DLLが必要としているDLLの読み込みに失敗したときにも発生するようです。
PHP7でcurl、opensslエラーによると、OpenSSLのバージョンが古いためにエラーになっているとのことです。
そこで、こちらのサイトで差し替えている2つのファイル(libeay32.dllssleay32.dll)をローカルディスク内検索してみると、いくつも見つかりました。しかも、xampp¥apache¥bin¥はもとよりxampp¥php-5.4.31¥xampp¥php-7.1.7¥にも見つかりました。
はらば、利用するPHPで呼び出しているファイルと同じものをApacheでも使えば良いのではないかと想像できます。ということで、xampp¥apache¥bin¥にあるlibeay32.dllssleay32.dllを差し替えて見たところエラーが出なくなりました。