🐘

XAMPPのPHPをなるべく簡単にバージョンを切り替える方法

2022/11/05に公開

WindowsのXAMPPでPHPによる開発を行う際、開発する環境とリリースする環境をなるべく近づけて開発を行ったり、検証を行いたいということがあると思います。
そこで今回は、XAMPPのPHPのバージョンを、なるべく簡単に切り替えられる方法をご紹介します。

事前準備

PHPのバージョンを用意

PHPの各バージョンは二つの方法で入手することができます。
一つはPHP公式のアーカイブページ、もう一つSourceForge.netのXAMPPが保管されているページです。
PHP公式のアーカイブページは時期によって異なりますが、この記事を書いている時はPHPのバージョンで5.2.6から最新までが保管されています。
SourceForge.netではXAMMPPのバージョンで0.9(PHPのバージョンは4.3.3)から最新までが保管されています。

公式のアーカイブは5.2.6からのバージョンが保管されているのに対し、SourceForge.netは4.3.3からのバージョンが保管されています。
SourceForge.netのほうはXAMPPの環境に最適化された状態のものが入っていますが、XAMPPのバージョンによって含まれているPHPのバージョンが飛び飛びになっています。

使用するPHPのバージョンをアーカイブ(ZIP)ファイルでダウンロードします。

エクスプローラーでXAMPPがインストールされているフォルダへ移動し(初期はC:¥xampp)、新規フォルダを作成します。
フォルダ名は何でもよいですが、ここでは分かりやすく"php5.6.40"のように"php"にバージョン番号を繋げた名前にします。

作成したフォルダを開き、先ほどダウンロードしたアーカイブファイルを解凍し展開します。
なお、SourceForge.netのXAMPPの場合は、一度アーカイブファイルを開き、その中にあるphpという名前のフォルダをさらに開いた後のファイル群を、作成したフォルダに解凍し展開します。

XAMPPがインストールされているフォルダへ移動し、phpという名前のフォルダの名前を変更します。

これでPHPのバージョンごとの設置は完了です。
php.iniを変更していたりする場合は、新しく設置したphp.iniをあわせて変更しておいてください。

メジャーバージョンごとのApache設定

Apache側のPHPの設定は、PHPのメジャーバージョンごとに設定が異なるため、XAMPPに予め含まれていたPHPのバージョンとメジャーバージョンが異なるようであれば、その設定を用意します。

まず、XAMPPがインストールされているフォルダにあるapache\conf\extra\httpd-xampp.confを複製します。
XAMPPに予め含まれていたバージョンが7系であれば、複製元のファイル名を"httpd-xampp-php7.conf"のようにし、新たに設置したPHPのバージョンが5系であれば、複製したファイル名を"httpd-xampp-php5.conf"のようにします。

複製した設定ファイルを開き、該当箇所を書き換えます。
例えばもともと7系で5系を追加した場合、"php7"と書かれている箇所があったら、その部分を"php5"に書き換えます。

現在のPHPを指定

コマンドプロンプトなどコマンドラインツールを<u>管理者権限で</u>起動します。

cdコマンドを実行し、XAMPPがインストールされているフォルダへ移動します。

cd C:\xampp

mklinkコマンドをmklink /D シンボリックリンク名 参照元のパスという入力で実行し、XAMPPの初期で導入されていたPHPのバージョンのシンボリックリンクを作成します。

mklink /D php C:\xampp\php7.1.31

cdコマンドを実行し、httpd-xampp.confがあるフォルダへ移動します。

cd apache\conf\extra

mklinkコマンド実行し、先ほど作成したシンボリックリンクのPHPのバージョンにあわせて、メジャーバージョンのhttpd-xampp.confのシンボリックリンクを作成します。

mklink httpd-xampp.conf C:\xampp\apache\conf\extra\httpd-xampp-php7.conf

cdコマンドを実行し、apacheフォルダへ移動します。

cd ..\..

bin\httpd.exeコマンドを実行しApacheを再起動します。

bin\httpd.exe -k restart

これで現在のXAMPPの状態を整えました。

次の画像はこれらの内容を実行したコマンドの例です。

コマンドプロンプトでコマンドを実行した例

バージョンを切り替え

コマンドプロンプトなどコマンドラインツールを<u>管理者権限で</u>起動します。

cdコマンドを実行し、XAMPPがインストールされているフォルダへ移動します。

cd C:\xampp

rmdirコマンドを実行し、phpフォルダのリンボリックリンクを削除します。

rmdir /s /q php

mklinkコマンドを実行し、切り替えたいPHPのバージョンのシンボリックリンクを作成します。

mklink /D php C:\xampp\php5.6.40

cdコマンドを実行し、httpd-xampp.confがあるフォルダへ移動します。

cd apache\conf\extra

delコマンドを実行し、httpd-xampp.confのリンボリックリンクを削除します。

del /q httpd-xampp.conf

mklinkコマンド実行し、先ほど作成したシンボリックリンクのPHPのバージョンにあわせて、メジャーバージョンのhttpd-xampp.confのシンボリックリンクを作成します。

mklink httpd-xampp.conf C:\xampp\apache\conf\extra\httpd-xampp-php5.conf

cdコマンドを実行し、apacheフォルダへ移動します。

cd ..\..

bin\httpd.exeコマンドを実行しApacheを再起動します。

bin\httpd.exe -k restart

切り替わったかどうか、phpコマンドを実行して確認します。
-vオプションを付けることでPHPの現在のバージョンを確認できます。

php -v

これでPHPのバージョンの切り替えが完了しました。

次の画像はこれらの内容を実行したコマンドの例です。

コマンドプロンプトでコマンドを実行した例

切り替えをバッチファイルにまとめる

バッチファイルを作成しておくと、バージョンの切り替えを少しスムーズに行うことができます。
次のコードはコマンドライン経由かバッチファイルを直接起動することで、指定したバージョンを切り替えることができるバッチファイルの例です。

@echo off

set v=

rem 引数によるバージョン指定
call :versionMatches %1

rem 指定のバージョンなら次のステップへ
if %isMatch%==true (
	set v=%1
	goto step1
)

rem 質問メッセージ
set /p q="切り替えるバージョンを入力してください。"

rem 入力によるバージョン指定
call :versionMatches %q%

rem 指定のバージョンなら次のステップへ
if %isMatch%==true (
	set v=%q%
	goto step1
)

rem === STEP1:エラーチェック ===
:step1

set isMatch==false

rem 空白じゃなく指定のバージョンが見つかるか判定
if not "%v%"=="" if exist "C:\xampp\php%v%" set isMatch=true

rem 見つかったら次のステップへ
if %isMatch%==true goto step2

rem 見つからなければエラーメッセージを表示して処理を終了
echo 入力されたバージョンが見つかりませんでした。

goto end

rem === STEP2:切り替え処理 ===
:step2

rem メジャーバージョンを取得
set major_v=%v:~0,1%

rem XAMPPのインストールディレクトリへ移動
cd /d C:\xampp

rem phpディレクトリを削除
rmdir /s /q php

rem バージョンにあわせたphpディレクトリのジャンクションリンクを作成
mklink /J php C:\xampp\php%v%

rem 設定ディレクトリへ移動
cd apache\conf\extra

rem 設定ファイルを削除
del /q httpd-xampp.conf

rem ApacheのXAMPP用設定ファイルをPHPのメジャーバージョンにあわせてシンボリックリンクを作成
mklink httpd-xampp.conf C:\xampp\apache\conf\extra\httpd-xampp-php%major_v%.conf

rem apacheディレクトリへ移動
cd ..\..

rem Apacheを再起動
start bin\httpd.exe -k restart

goto end

rem === バージョンが一致するか判定 ===
:versionMatches

set isMatch=false

if "%1"=="5.6.40" set isMatch=true
if "%1"=="7.1.31" set isMatch=true

exit /b

rem === 処理を終了 ===
:end

pause

exit /b

このコードをエディタなどで記述し、switch-php-version.batのようにバッチファイルとして保存します。

このバッチファイルを使用して切り替えるには二つ方法があり、一つはコマンドラインでswitch-php-version.bat 5.6.40と引数で切り替えたいバージョンを指定することで、切り替えることができます。

もう一つはバッチファイルを直接起動すると、"切り替えるバージョンを入力してください。"とメッセージが表示されるので、切り替えたいバージョンを入力し、Enterキーを押すと切り替えることができます。

なお、どちらのバッチファイルで切り替える方法も、管理者権限で実行する必要があります。

Discussion