Macで複数のバージョンのPHPを同時に使う


この記事で紹介している手動のインストールを、自動で行う新しい記事「[PHPComplete: 複数のPHPバージョンを一括インストール](https://qiita.com/koriym/items/78d51c2cd34e6a4c6e15)」を公開しました。 

---

## 概要

Macで複数のバージョンのPHPをXdebugと共にインストールして利用可能にします。その際なるべくグローバルに影響を与えない方法で行います。**[phpenv](https://github.com/phpenv/phpenv)** などの管理ツールは利用しません。

## PHP

[shivammathur/php](https://github.com/shivammathur/homebrew-php) を使ってbrewでインストールします。PHP5.6からサポートされています。


```
brew tap shivammathur/php
brew install shivammathur/php/php@5.6
brew install shivammathur/php/php@7.0
brew install shivammathur/php/php@7.1
brew install shivammathur/php/php@7.2
brew install shivammathur/php/php@7.3
brew install shivammathur/php/php@7.4
brew install shivammathur/php/php@8.0
brew install shivammathur/php/php@8.2
brew install shivammathur/php/php@8.2
```

PHP8.0の場合、以下のパスにインストールされます。

* Appleシリコン CPUの場合
```
/opt/homebrew/opt/php@8.0/bin/php
```

* Intel CPUの場合
```
/usr/local/opt/php@8.0/bin/php
```

## Xdebug

peclでインストールします。

* Appleシリコン CPUの場合
```
/opt/homebrew/opt/php@5.6/bin/pecl install xdebug-2.5.5
/opt/homebrew/opt/php@7.0/bin/pecl install xdebug-2.7.2
/opt/homebrew/opt/php@7.1/bin/pecl install xdebug-2.9.8
/opt/homebrew/opt/php@7.2/bin/pecl install xdebug-3.1.6
/opt/homebrew/opt/php@7.2/bin/pecl install xdebug-3.1.6
/opt/homebrew/opt/php@7.3/bin/pecl install xdebug-3.1.6
/opt/homebrew/opt/php@7.4/bin/pecl install xdebug-3.1.6
/opt/homebrew/opt/php@8.0/bin/pecl install xdebug
/opt/homebrew/opt/php@8.1/bin/pecl install xdebug
/opt/homebrew/opt/php@8.2/bin/pecl install xdebug
```

* Intel CPUの場合
```
/usr/local/opt/php@5.6/bin/pecl install xdebug-2.5.5
/usr/local/opt/php@7.0/bin/pecl install xdebug-2.7.2
/usr/local/opt/php@7.1/bin/pecl install xdebug-2.9.8
/usr/local/opt/php@7.2/bin/pecl install xdebug-3.1.6
/usr/local/opt/php@7.3/bin/pecl install xdebug-3.1.6
/usr/local/opt/php@7.4/bin/pecl install xdebug-3.1.6
/usr/local/opt/php@8.0/bin/pecl install xdebug
/usr/local/opt/php@8.1/bin/pecl install xdebug
/usr/local/opt/php@8.2/bin/pecl install xdebug
```

* [Supported Versions and Compatibility](https://xdebug.org/docs/compat) で PHPに対応したXdebugのバージョンが分かります。
* [PECL :: Package :: xdebug](https://pecl.php.net/package/xdebug) で対応バージョンの最新版の正確なバージョンが分かります。

PECLでインストールしたextentionのインストール先はpearコマンドで分かります。

```
pear config-show | grep ext_dir
PHP extension directory        ext_dir          /opt/homebrew/lib/php/pecl/20200930
```

## 切り替え

利用するPHPを選択する方法はいくつかあります。ターミナルで選択する方法だと複数のPHP

## ターミナルで選択

この方法はグローバルのパスを変えるのではなく、ターミナルの範囲内だけでphpのパスをPATH環境変数によって選択します。同時に複数バージョンのPHPの操作が可能です。

ターミナル > 環境設定 > プロファイル > コマンドを実行で目的のPHPのバイナリのパスを`export`します。`php -v`も実行しておくと便利です。

* Appleシリコン CPUの場合
```
export PATH="/opt/homebrew/opt/php@8.0/bin/:$PATH"; php -v
```

* Intel CPUの場合
```
export PATH="/usr/local/opt/php@8.0/bin/php:$PATH"; php -v
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940/0b30525d-6c05-e00e-2826-1b864dd19729.png)
`テキスト`タブでタイトルをPHP7.4などと変えます。`ウインドウ`で背景の色を変えるとさらに区別しやすいでしょう。

ターミナルの新規ウインドウでPHPを選んで利用します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940/7c5868cc-b499-3b6e-3ed5-f5d3bc048362.png" width=50%>

## グローバルで切り替え

パスで指定されてていな時のPHPを切り替えます。

### brew linkで切り替え 

特別のツールを必要としない一番シンプルな方法です。brewで切り替えます。

```
brew link --overwrite --force shivammathur/php/php@8.1
```

`/opt/homebrew/bin/php`で指定されるPHPが指定のバージョンのものになります。

## sphpで切り替え 

`sphp`スクリプトをインストールして切り替えます。この方法はbrew linkで切り替える方法に加えて、apacheのPHPバージョンも切り替えます。

```
curl -L https://raw.githubusercontent.com/rhukster/sphp.sh/main/sphp.sh > /opt/homebrew/bin/sphp
chmod +x /opt/homebrew/bin/sphp
```

```
sphp 7.2
```

ローカルのapacheで複数バージョンのPHPを利用するときは[ Apache Setup: Multiple PHP Versions](https://getgrav.org/blog/macos-bigsur-apache-multiple-php-versions)をご覧ください。

## PHPStormで

`⇧ ⌘ A`を押して`Change PHP interpreter`とタイプして選ぶこともできます。

<img src="https://resources.jetbrains.com/help/img/idea/2022.1/ps_quick_switch_php_interpreter.animated.gif">

## PHPStormのcomposerで

PHP > Composer > Excutionで `composer.phar`を選ぶとPHPのバージョンが指定できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3940/c1a6168e-3be0-b5fc-360e-f8e71e63a175.png)

## PHPStormのターミナルで

現在、これといった決め手がありません。

`export PATH="/opt/homebrew/opt/php@8.1/bin/:$PATH";`を実行するとか、これを`.php81.sh`として保存しておいて実行するとか...

```
. ~/.php81.sh
```

ツールと同じように切り替えできて、他のシェルに影響を与えません。

必要ならMySQLクライアントなどのパスも含めてプロジェクト単位のスクリプトを用意します。


issueは上がっています。`vote`をして支持をしましょう。
https://youtrack.jetbrains.com/issue/WI-66898

## composer.jsonで

スプリクトのphpを`@php`にするとcomposerスクリプト実行時のPHPで実行します。

https://getcomposer.org/doc/articles/scripts.md#executing-php-scripts

```
{
    "scripts": {
        "test": [
            "@php script.php",
            "phpunit"
        ]
    }
}
```