いくつものプロジェクトに携わって行くと、開発環境がそれぞれ異なることがよく起こります。
今回は、複数のバージョンの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:¥xampp
にphp-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.dll
、ssleay32.dll
)をローカルディスク内検索してみると、いくつも見つかりました。しかも、xampp¥apache¥bin¥
はもとよりxampp¥php-5.4.31¥
、xampp¥php-7.1.7¥
にも見つかりました。
はらば、利用するPHPで呼び出しているファイルと同じものをApacheでも使えば良いのではないかと想像できます。ということで、xampp¥apache¥bin¥
にあるlibeay32.dll
とssleay32.dll
を差し替えて見たところエラーが出なくなりました。