miseを使って複数のPHPバージョンをインストールする 

# やりたいこと
- Macで
- 簡単なインストールで
- php8.1とphp8.2をインストールし
- php8.1なプロジェクトにcdしたらphp8.1を使いたい
- php8.2なプロジェクトにcdしたらphp8.2を使いたい

# mise
- https://github.com/jdx/mise
- The front-end to your dev env.
- mise (pronounced "meez")
- mise was formerly called rtx. 

<details><summary>asdfとの比較</summary><div>

- asdfはランタイムを呼び出すときにオーバーヘッド（～120ms）かかるが、miseはプロンプトがロードされるときに少量のオーバーヘッド（～5ms）を追加する。
- [参考](https://mise.jdx.dev/dev-tools/comparison-to-asdf.html#:~:text=mise%20adds%20a%20small%20amount%20of%20overhead)

</div></details>


# Uninstall old phps
- brewでインストールしたphpがあるなら削除しておく
```bash
brew remove php@8.2 php@8.1 php@8.0 php@7.4 php
```

# Dependencies
- miseとphpの依存をインストールする
- [asdf-phpのreadme](https://github.com/asdf-community/asdf-php)に書いてあるとおりですが、[ここ](https://github.com/asdf-community/asdf-php/blob/master/.github/workflows/workflow.yml#L48-L55)に依存パッケージが書いてあります。
```bash
# Install packages
brew install autoconf automake bison freetype gd gettext icu4c krb5 libedit libiconv libjpeg libpng libxml2 libzip openssl@1.1 pkg-config re2c zlib

# Install conflicting packages
brew install openssl@3
```

# Install, Setup mise
- miseをインストールして設定する(zshの場合)
```bash
# Install
curl https://mise.jdx.dev/install.sh | sh

# zsh
echo "eval \"\$(~/.local/bin/mise activate zsh)\""    >> ~/.zshrc
echo 'export PATH="$HOME/.local/share/mise/shims:$PATH"' >> ~/.zprofile
source ~/.zshrc
```

# Install asdf-php
- miseではasdf-phpというコミュニティpluginを使ってphpをインストールするため。
```bash
mise plugin install php https://github.com/asdf-community/asdf-php
```

# List phps
- miseを使ってインストール可能なphpを表示する
- RCがlatestになるようです
```bash
# 全表示
mise ls-remote php

# 8.1系を表示
mise ls-remote php@8.1

# 8.2系を表示
mise ls-remote php@8.2

# 8.2系のlatestを表示
mise latest php@8.2
```

# Install phps
- miseをつかってphpをインストールする
```bash
mise install php@8.1.27
mise install php@8.2.15
```

# Set php version
- 各プロジェクトにバージョン指定ファイルを作る
- このファイルがあることでこのdirにcdしたとき、phpのバージョンが変わります
- [ドキュメント](https://mise.jdx.dev/configuration.html)
```bash
echo "[tools]\nphp = '8.2'" > ~/your/php82/project/.mise.toml
echo "[tools]\nphp = '8.1'" > ~/your/php82/project/.mise.toml
```

# Tests
- 実害はないけど、mise use後に1秒くらい待たないとバージョンが切り替わらないような気がする
```bash
mkdir -p /tmp/php81 /tmp/php82

# Global phpのテスト
cd /tmp
mise use --global php@8.2
php -v

# php81のテスト
cd /tmp/php81
mise use php@8.1
php -v

# php82のテスト
cd /tmp/php82
mise use php@8.2
php -v
```

# Install php extentions
- phpバージョンごとにpeclコマンドがあるのでそれぞれのバージョンでpecl installする
```bash
mkdir -p /tmp/php81 /tmp/php82

# php81
cd /tmp/php81
mise use php@8.1
pecl install igbinary
pecl install imagick
pecl install xdebug
pecl install redis
pecl install apcu
# 自分のphp81プロジェクトに必要なextををインストールしてください

# php82
cd /tmp/php82
mise use php@8.2
pecl install igbinary
pecl install imagick
pecl install xdebug
pecl install redis
pecl install apcu
# 自分php82のプロジェクトに必要なextををインストールしてください
```

# php.ini
- php8.1の例。例です例
```bash
$(cat << 'EOF' > $(mise where php@8.1)/conf.d/php.ini
# add system-wide php configuration options here
extension=redis.so
extension=apcu.so
extension=ddtrace.so
extension=igbinary.so
extension=imagick.so
zend_extension=opcache.so

date.timezone=Asia/Tokyo
upload_max_filesize=200M
post_max_size=200M

opcache.preload=
opcache.preload_user=
opcache.validate_timestamps=1
opcache.file_update_protection=2
EOF
)
```
- php8.2の例。例です例
```bash
$(cat << 'EOF' > $(mise where php@8.2)/conf.d/php.ini
# add system-wide php configuration options here
extension=redis.so
extension=apcu.so
extension=ddtrace.so
extension=igbinary.so
extension=imagick.so
zend_extension=opcache.so

date.timezone=Asia/Tokyo
upload_max_filesize=200M
post_max_size=200M

opcache.preload=
opcache.preload_user=
opcache.validate_timestamps=1
opcache.file_update_protection=2
EOF
)
```

# ほか
```bash
# php full pathを知りたいとき
mise where php@8.1
mise where php@8.2

# アップグレードしたいとき
mise upgrade php@8.1
mise upgrade php@8.2

# shim phpを使いたいとき
~/.local/share/mise/shims/php --version

# インストール済みのphpバージョンを表示する
mise ls php

# phpをアンインストールする
mise uninstall php@8.1.27RC1
mise uninstall php@8.2.16RC1

# キャッシュクリア
mise cache clear
```