14
Help us understand the problem. What are the problem?

posted at

updated at

WindowsでマルチPHPをもっと楽に実現する

windowsでマルチPHPを実現するという記事を見かけたのですが、ジャンクションを使ったほうがもっと楽なのでやり方を紹介します。

シンボリックリンクでもいいんだけど何故か管理者権限が必要だし、今回の用途であればジャンクションで十分です。
なおショートカットでは駄目です。

PHPをインストール

PHP For Windowsから適当にファイルをダウンロードして、適当にディレクトリに展開します。
今回はとりあえず
C:\xampp\php7.4.26
C:\xampp\php8.0.13
ってかんじに配置しました。

なんでxamppなのかって?
そりゃXAMPPを使ってるからに決まってる。

エイリアスを設定

参考記事に合わせて記述すると、こんなかんじになるでしょうか。

vi /c/php/php

#!/usr/bin/bash
"/c/xampp/php/php.exe" $*
vi /c/php/php.bat

@echo off
"C:\xampp\php\php.exe" %*
vi ~/.bash_profile

alias php='/c/xampp/php/php'

私は環境変数PATHにC:\xampp\phpって突っ込んで済ませますが。

ジャンクションを作成

cmdで以下のコマンドを打つと、C:\xampp\phpというジャンクションが作成されます。

mklink /J C:\xampp\php C:\xampp\php8.0.13

一見ショートカットに見えるのですが実際はジャンクションです。
見分け方はコマンドラインでdircdしてみればいいです。

これで無事に、phpコマンドでPHP8.0.13が実行されるようになりました。

01.png

PHPバージョンを変更

phpコマンドでPHP8.0.13が実行されるようになりましたが、これを変更してみましょう。
やりかたは以下のコマンドを打つだけです。

rmdir C:\xampp\php
mklink /J C:\xampp\php C:\xampp\php7.4.26

これでphpコマンドで実行されるPHPが、PHP7.4.26になりました。

02.png

何処から使用するかを気にせず、ジャンクションを変更するだけで常に全てのPHPバージョンが切り替えられるようになります。
べんりですね。

これでコマンドを2個打つだけで、好きにPHPのバージョンを切り替えられるようになりました。
切り替えコマンドをバッチにしてphpvm use 8.1.0みたいに書けるようにすると、もっと便利になるかもしれませんね。
というか実際それをやったのがNVM for Windowsです。

NVM for Windows

NVM for Windowsは、バージョン切り替えに上記と同じような仕組みを使っています。

nvm installでNodeをインストールするとC:\Program Files\nodejs\ディレクトリができるのですが、このnodejsはシンボリックリンクです(ジャンクションではない)。
実際の中身はC:\Users\hoge\AppData\Roaming\nvm\v1.2.3みたいなところに配置されて、nodejsはそこを参照するという構造です。

nvm use 4.5.6と打つと、このシンボリックリンクがC:\Users\hoge\AppData\Roaming\nvm\v4.5.6と切り替わり、以後は何処からnodeコマンドを打っても変更後のバージョンになります。
べんりですね。

このように、PHPやNodeだけではなく、インストールを必要としないソフトウェアであれば何にでも使える手法です。
なにか面白い使い方があったら教えてくださいね。

まとめ

Docker使え?

知るか。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
14
Help us understand the problem. What are the problem?