複数のxamppに実装したシステムを、即時に切り替えできるバッチファイルを作成してみた

自分が作成依頼を受けるシステムは小、中規模のものが多いので開発環境にxamppを用いることが多いのですが、プロジェクトごとにhtdocsの中身を差し替えたりするのは流石に不便な上、業務によっては仕様の関係でPHPのバージョンが古かったりします。

そこで複数のXAMPPに実装したシステムを自在に切り替えできるようなバッチファイルを作成してみました。

# 手順
1. システムの配置
1. パスの書き換え
1. バッチファイルの作成

以下の手順で作っていきますが、大事なポイントはジャンクションを活用していることです。これを用いることによって、逐一ポート番号を割り振らなくても、同一ポートで内部システムだけを切り替えることができます。

# システムの配置
Cドライブ直下にシステムを配置していきます。ここで重要なのは**xamppというフォルダ直下のhtdocsに構築している場合は、被らないように名称を書き換えておく**ことです（たとえばCドライブにPHP5.6のxamppが設定されている場合、フォルダ名はxampp56とでもしておきます。xamppのままだと後でジャンクションを設定できません）。

以下のような要領で、名前を変えていきます。

| PHP | 種類 | 書き換えたフォルダ名 |
|:-:|:-:|:-:|
| 5.6 | 32bit | xampp56 |
| 7.2 | 64bit | xampp72 |

```
- C:\xampp
+ C:\xampp56
+ C:\xampp72
```

# パスの書き換え
さて、フォルダ名はこれで書き換わりましたが、設定ファイル上のパスはxamppのままです。そこで今度は設定ファイル上のパスを先程指定したフォルダ名に書き換える必要があります。

書き換える必要があるファイルはこれだけあるようです。

- [一台のWindowsPCに複数のxamppをインストールする方法](https://office-obata.com/report/memorandum/post-5161/)

ところが、このブログページにヒントがあるように、**指定フォルダ内のiniファイルとconfファイルのみ書き換えれば良い**ので、フォルダ内全変換が可能なエディタを使えば、すぐです。自分はNotepad++の置換機能を用いて変更を施しました。

### xampp56内
- /xampp/  →　/xampp56/
- \xampp\ →　\xampp56\

### xampp72内
- /xampp/ → /xampp72/
- \xampp\ → \xampp72\

この4パターンをconfファイル、iniファイルで置換していきます。正規表現を用いればすぐです。

```
マッチング: (\/|\\)(xampp)(\/|\\)
置換：　${1}${2}56${3} 
```
xampp72の場合は56を72に変更。置換記号と数値が混同しないように、ブラケットを忘れないようにしましょう。

# バッチファイルの作成
ここからシステムを自在に切り換えできるように、バッチファイルを作成していきます。xamppというジャンクションを作成することで、このジャンクションの性質を利用して、xampp56フォルダ直下、またはxampp72フォルダ直下を紐づけたりしています。

バッチファイル作成にあたっては、以下のページを参考にしています。

切り換えと分岐の方法
- [XAMPP複数Versionを共存させる](https://qiita.com/tksnino/items/01ad8cf0e8296f1d5ff5)

シンボリックリンクの貼り方
- [XAMPPで複数のバージョンのPHPを切り替えて使う方法](https://techmemo.biz/web-cheat-sheet/xampp-php-version-change/)

ジャンクションについて
- [WindowsでマルチPHPをもっと楽に実現する](https://qiita.com/rana_kualu/items/f5f04fcfc506af6d0830)

```txt:xampp_changer.bat
@echo off
cls
:TOP
set /p version="PHP version?(5,7):"
rmdir /s C:\xampp
if %version%==5 ( 
  mklink /j C:\xampp C:\xampp56
  set xampp="C:\xampp56\xampp-control.exe"
  set mysql="C:\xampp56\mysql\bin\mysqld.exe
) else if %version%==7 (
  mklink /j C:\xampp C:\xampp72
  set xampp="C:\xampp72\xampp-control.exe"
  set mysql="C:\xampp72\mysql\bin\mysqld.exe
) else (
  echo %version% is unsupported version.
)
goto :TOP

```

説明していくと、
1 5か7を入力することで、PHP5.6で動いているシステムxampp56とPHP7.2で動いているシステムxampp72が選択される。
2 それぞれのシステムに対して、ジャンクションを設定する。
3 ジャンクションで設定した後に、apacheとmysqlの起動を行う。

つまり、ジャンクションでパスの参照先を切り替えることで、システムの中身を見せかけ上、入れ替えているわけです。

ジャンクションは一度生成されると一旦削除しないと中身が入れ替わらないので、コマンドが実行されたタイミングで、事前に削除処理を施しています。

## ジャンクション作成のコマンド
バッチファイルでのジャンクション作成のコマンドは以下の通りです。
```
mklink /j 分岐したいフォルダ名　リンク元のフォルダ名
``` 
ここでは、分岐したいフォルダ名はxamppで、リンク元はxampp56、xampp72にあたります。

# 操作方法
バッチファイルを実際に起動するとこのように表示されるので、適宜5か7を入力します。

![SnapCrab_No-0003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/f590cc60-1a8a-ab85-c896-92a80f755d00.jpeg)

それぞれ、以下のように切り替わります（ブラウザの再読み込みで問題ないようです。ショートカットキーならF5）

| xampp56 | xampp72 |
|:-:|:-:|
| ![xampp56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/b8fcf9bb-a308-1546-000b-97695689c6de.jpeg)|![xampp72.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272191/2affd7ee-dd5a-bbb2-5999-2925e3144a59.jpeg)|

少し見づらいですが、**localhostのポートは同一、8080のまま**であるのもわかると思います。

これを応用すれば、いくつでもシステム環境を構築することができます。なお、シンボリックリンクでも切り替え可能ですが、管理者権限でcmdを操作しないといけないのと、タイムラグが発生し、ときどき切り替わらない現象が発生したりします。

応用すれば、同一xamppでhtdocsにジャンクションを設定して、プログラムを切り替えることもできそうです。