Windows で複数のバージョンの PHP を切り替えて使う

2023年1月12日

※以前に掲載したスクリプトを使うと、環境変数 PATH に同じパスが重複して登録され、最終的にはパスが追加できなくなる不具合があることが判明したため、スクリプトを差し替えています(2023年1月12日更新)

2022年11月現在、PHP の安定版(Current Stable)は 8.1 ですが、レンタルサーバでは Old Stable バージョンである 8.0 や 7.4 が現役だったりします(PHP の Supported Versions のページを見ると、7.4 については2022年11月28日で Security Support の期限が切れるので、そろそろ退役させるべきだと思いますが…)。

バージョン間で互換性のない部分があるため、本番環境に合わせて PHP のバージョンを使い分ける必要があるのですが、Mac や Linux で定番の複数バージョン管理ツールである phpenv は Windows で使うにはハードルが高いです。というわけで、PowerShell を使ってバージョンを切り替えるスクリプトを書いてみました。PHP のインストールについては対応していないので、Chocolatey などを使ってあらかじめインストールしておいてください。Chocolatey の場合、

choco install php --version=7.4.32 -m
choco install php --version=8.1.12 -m

とすることで、複数バージョンを併存させてインストールすることできます。その結果、PHP 8.1 は C:\tools\php81 に、PHP 7.4 は C:\tools\php74 にそれぞれインストールされたものとして、以下の説明を続けます。

PHP のバージョンを切り替える PowerShell スクリプト

Param(
    [ValidateSet("8.1","7.4")][String]$Version
)

# Reload Environment Function
function Reload-Env {
    $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
}

# Set Environment Function
function Set-Env {
    Param( $PHPDIR )
    [System.Environment]::SetEnvironmentVariable("PHP_PATH", $PHPDIR, "Machine")
    $Environment = ([System.Environment]::GetEnvironmentVariable("Path","Machine").Split(';') | Where-Object -FilterScript {$_ -notmatch '%PHP_PATH%|.+php.+'}) -join ';'
    [System.Environment]::SetEnvironmentVariable("Path", $Environment + ';%PHP_PATH%', "Machine")
    Reload-Env
}

switch ($Version) {
    "8.1"
    {
        Set-Env('C:\tools\php81')
        break
    }
    "7.4"
    {
        Set-Env('C:\tools\php74')
        break
    }
    default
    {
        $PhpVersion = ` php -v
        Write-Output $PhpVersion
        break
    }
}

使い方

適当な場所にスクリプトを保存し(以下の例では、C:\Users\hoge\phpenv.ps1)、PowerShell を管理者権限付きで開いてください(システム環境変数を書き換えるため)。

PHP 7.4 にする場合

C:\Users\hoge\phpenv.ps1 -Version 7.4

PHP 8.1 にする場合

C:\Users\hoge\phpenv.ps1 -Version 8.1

現在有効となっているバージョンを確認したい場合

php -v の結果を出力します。

C:\Users\hoge\phpenv.ps1

ValidateSet 属性を付けているので、Tab キーを押すことで候補を切り替えることができます。引数が1つだけなので、C:\Users\hoge\phpenv.ps1 8.1 でも OK です。