いまさらだけどPHP の環境構築では何を行なっていたのかをわかりやすくまとめてみた

# はじめに
最近 M2 のMacbook Airを購入し、PCにPHPをゼロからインストールする必要がありました。今回はその時に学んだ、PHPの環境構築方法とPHPをインストールする際に何が行われているかについてまとめてみました。

特に、
✅ PHPのインストール方法はわかるが、内部でどんなことを行なっているのかわからなかった
✅ Mac OS に、どんなことが行われているのかを簡単にでも理解しながらPHP をインストールしたい！

みたいな人には参考になる部分があるのではないかと考えています。



### 対象とするPHPのバージョン
今回の記事では、最新の安定版であるPHP 8.2.7のインストールを例に取ります。また、ツールとしてはmacOS向けのパッケージマネージャーであるHomebrewを使用します。

### 対象とするOS
この記事を作成するにあたって、Mac M1、M2(Intel版含む)の全てで試しました。ですので、Macであれば問題なく最後まで作業を進められると思います。

# 0. PHP インストールの全体像
先にコマンドのみ、まとめておきます。
これをターミナル上で順に打ち込んんでいけば、Mac OS上で PHP を動作させることができます。

```javascript
// Homebrewのインストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

// Homebrewの設定
// M1、M2(Apple Silicon) の Mac
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc

// Intelチップ の Mac
// echo 'eval "$(/usr/local/bin/brew shellenv)"' >> ~/.zshrc

// Homebrewの設定を反映
source ~/.zshrc

// PHPをインストール
brew install php

// PHPのPATHを設定
echo 'export PATH="/usr/local/opt/php/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/usr/local/opt/php/sbin:$PATH"' >> ~/.zshrc

// 設定を反映
source ~/.zshrc

// PHPの確認
php -v
```

# 1. Homebrewのインストール
まずは、macOS向けのパッケージマネージャーであるHomebrewをインストールします。Homebrewはソフトウェアのインストールを容易にする強力なツールで、PHP以外にも色々使えます。

以下のコマンドをTerminalで実行してください：

```javascript
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

/bin/bash -c：この部分は、引数として与えられたコマンドをbashシェルで実行します。

ここで注目すべき点は、このコマンドが/bin/bashを使用しているところです。なぜなら、Homebrewのインストールスクリプトはbashで書かれており、bash特有の機能を用いているからです。したがって、Zshなど他のシェルではなく、bashを用いてスクリプトを実行します。
つまり、
```javascript:悪い例 (  /bin/bash　=>　/bin/zsh  に変更)
/bin/zsh -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
ではいけないという意味です。
これは、bashで書かれたスクリプトはbashで実行するべき、という原則から来ていて、
個人的に、Rubyで書かれたコードはruby のコンパイラーなど何かしらで実行するべきで、Rubyで書かれたコードを Java のコンパイラーで実行するべきではないといった感じの解説がわかりやすかったです。

もう少し詳しくみていきます。

```javascript
"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
この部分は、 curl コマンドを使って指定したURLからスクリプトをダウンロードし、それを bash で実行します。具体的には、 Homebrew の公式 GitHub リポジトリから install.sh という名前のインストールスクリプトをダウンロードしています。

#### ダウンロードするスクリプト

![Screenshot 2023-07-03 at 7.47.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980785/c544513c-9462-ed16-880b-a6d6e1894dc8.png)



### インストールするスクリプトのURL

https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh

### オプション部分の解説

curl：
ターミナル上で、URLからデータを取得するために使われます。

-fsSL：
これらはcurlのオプションで、具体的な意味は以下の通りです。

-f：サーバーがエラーを返した場合に、curlがエラーメッセージを出力するようにします。
-s：silentモードを意味し、ダウンロードの進行状況などの詳細な情報を表示しないようにします。
-S：エラーが発生した場合にのみメッセージを表示するようにします。これは-sオプションと一緒に使われることが多いです。
-L：リダイレクトされた場合に、そのリダイレクト先のURLにも追従するようにします。

### 2. Homebrewの設定
次に、Homebrewが正常に動作するために必要な環境変数を設定します。
IntelチップとM1やM2チップでは手順が違うことに注意してください。

Apple Silicon（M1やM2チップ）を搭載したMacでは、Homebrewは『/opt/homebrew』にインストールされますので、コマンドは以下のようになります：

```javascript
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc
```

一方、Intelチップを使用しているMacでは、Homebrewは『/usr/local』にインストールされますので、コマンドは以下のようになります：

```javascript
echo 'eval "$(/usr/local/bin/brew shellenv)"' >> ~/.zshrc
```
端的にいうと、ターミナル上で Homebrew を使えるように設定してくれるコマンドです。
このコマンドは、Homebrewがインストールされている場所（この例では/opt/homebrew や /usr/local）にあるbrewという名前の実行可能ファイルを呼び出し、そのshellenvというオプションを実行します。

```javascript
〇〇  >> ~/.zshrc
```
この部分に関して、
『>>』は、『オペレータ』といい、
『>> ~/.zshrc』部分で、『echo 'eval "$(/opt/homebrew/bin/brew shellenv)"'』をユーザのzsh設定ファイル（.zshrc）の末尾に追加します。

もう少し細かくみていきます。

/opt/homebrew/bin/brew shellenvコマンドは、Homebrewが動作するために必要な環境変数をエクスポートします。

具体的な出力は以下のようになります

```javascript
$ /opt/homebrew/bin/brew shellenv

set -gx HOMEBREW_PREFIX "/opt/homebrew";
set -gx HOMEBREW_CELLAR "/opt/homebrew/Cellar";
set -gx HOMEBREW_REPOSITORY "/opt/homebrew";
set -q PATH; or set PATH ''; set -gx PATH "/opt/homebrew/bin" "/opt/homebrew/sbin" $PATH;
set -q MANPATH; or set MANPATH ''; set -gx MANPATH "/opt/homebrew/share/man" $MANPATH;
set -q INFOPATH; or set INFOPATH ''; set -gx INFOPATH "/opt/homebrew/share/info" $INFOPATH;
```

この出力は、シェルの環境変数を設定する一連のコマンドです。
これら全ての set コマンドは、evalコマンドにより実行されます。


たとえば、
HOMEBREW_PREFIX という環境変数が、 /opt/homebrew という値に設定され、PATH 環境変数に /opt/homebrew/bin と /opt/homebrew/sbin を追加しています。

一方、
```javascript
set -q MANPATH; or set MANPATH ''; set -gx MANPATH "/opt/homebrew/share/man" $MANPATH;
```
というコマンドを見てみましょう。

まず、
```javascript
set -q MANPATH;はMANPATH
```
という環境変数が設定されているかどうかを確認します。設定されていない場合（つまり、set -q MANPATHが非0を返す場合）、
```javascript
or set MANPATH '';
```
が実行され、MANPATHという環境変数が空の文字列（''）に設定されます。

その後、
```javascript
set -gx MANPATH "/opt/homebrew/share/man" $MANPATH;
```
が実行されます。
これにより、 MANPATH という環境変数がグローバルにエクスポートされ、その値が /opt/homebrew/share/man に設定されて、さらに元の MANPATH の値（もし存在すれば）がその末尾に追加されます。


### オプション部分の解説

-g：このオプションは、変数をグローバルに設定します。つまり、その変数は現在のシェルとその子シェル（そのシェルから起動される他のコマンドやスクリプト）の両方で利用できるようになります。

-x：このオプションは、変数を環境変数としてエクスポートします。これにより、その変数は他のプロセスからも利用できるようになります。

-q：このオプションは、指定した変数が設定されているかどうかを確認します。変数が設定されている場合、set -qは0を返し、設定されていない場合は非0を返します。

##### ここまでのまとめ

最後に、『2. Homebrewの設定』で行なっている処理内容をまとめると、

```javascript:コマンド
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc
```

は、Homebrewが必要とする環境変数をターミナル上で使えるように設定するためのコマンドです。そして、既にこれらの環境変数が用意されている場合、このコマンドは何も出力しません​。


# 3.設定を反映させる

```javascript
source ~/.zshrc
```

このコマンドは、上で更新したzshの設定ファイルを読み込み、ターミナルで使用できるようにします。これによって、現在開いているターミナル上でも Homebrew が使えるようになります。

※ 下のように、
『インストールしたはずのHomebrewが使用できない...』という現象を回避するためです！

```:ターミナル
$ brew install php
zsh: command not found: brew
```



ここまでで、Homebrew がPC上で使用できるようになりました。

# 2. PHPのインストール
次に、Homebrewを使用してPHPをインストールします。以下のコマンドをTerminalで実行してください：

```javascript
brew install php
```

# 4. PATHの設定
次に、PHPの実行ファイルへのパスをシェルの設定ファイルに追記します。

```javascript
echo 'export PATH="/usr/local/opt/php/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/usr/local/opt/php/sbin:$PATH"' >> ~/.zshrc
```



# 5. 設定の反映
ここも　『2.設定を反映させる』 とほとんど同じ意味合いです。

```javascript
source ~/.zshrc
```
# 6. PHPの確認
最後に、PHPが正しくインストールされているかを確認します。以下のコマンドを実行してください：

```javascript
php -v
```
このコマンドを実行すると、インストールされているPHPのバージョンが表示されます。

これで、PHPの環境構築は完了です。

# 終わりに

今回の記事では、コマンド一つ一つが何をしているのかを深く見ていきました。ただコマンドを打つだけでなく、何をしているのか理解することで、万が一トラブルが起こったときにも対応しやすくなるのではないかと思います。加えて、この記事が皆さんのPHP環境構築の参考になれば幸いです。
訂正箇所があればご教授いただけますと幸いです。
今回は以上です。


#  補足: シェルの確認方法
現在使用しているシェルは何であるかを確認したい場合、以下のコマンドを実行してください

```javascript
echo $SHELL
```
このコマンドの出力が、 /bin/zsh であればZshシェル、 /bin/bash であればBashシェルをPCで使用していることになります。