自分のパターンに全て合致する記事がなかったのでまとめました。
主にこのへんを参考にしています。
インストール
xcode をインストール
AppStore からインストール。
HomeBrew をインストール
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
これにより /usr/local/bin
が作成され、その中に実行ファイル brew
が作成される。
依存ライブラリのインストール
PHPBrew で必要になるライブラリをインストール。/usr/local/bin/
に色々インストールされる。
brew link
によって /usr/local/Cellar/
からもシンボリックリンクが張られる。
$ brew install bzip2 curl intltool icu4c libxml2 mcrypt openssl readline zlib
$ brew link bzip2 --force
$ brew link curl --force
$ brew link icu4c --force
$ brew link libxml2 --force
$ brew link mcrypt --force
$ brew link zlib --force
以前のやり方では openssl も link していましたが、現在はエラーになるので行いません。
PHPBrew をインストール
HomeBrew を使ってインストールする方法は使わず、 curl を使ってインストール。
$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
# 実行属性を付けて、 /usr/local/bin/ に移動
$ chmod +x phpbrew
$ mv phpbrew /usr/local/bin/phpbrew
# phpbrew を初期化
$ phpbrew init
phpbrew init
によって /Users/{ユーザー}/.phpbrew/
が作成される。
PHPBrew を使って PHP をインストール
ここでは 7.2.10 をインストールしている。
+defaults
によってよく使うオプションをインストールし、さらに Nginx で使うために mysql、php-fpm などのオプションも指定。
openssl の場所は HomeBrew によってインストールされたものを指定。
$ phpbrew install 7.2.10 +default +mysql +fpm +openssl +curl +openssl=/usr/local/Cellar/openssl/1.0.2p
インストールが終わったら bash 用の設定をします。
$ echo "[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc" >> ~/.bashrc
$ source ~/.phpbrew/bashrc
PHP のバージョンを切り替えます。
# インストール前
$ which php
/usr/bin/php
$ php -v
PHP 7.1.16 (cli) (built: Apr 1 2018 14:10:37) ( NTS )
# PHPBrew でインストールしたものに切り替える
$ phpbrew use php-7.2.10
$ phpbrew switch php-7.2.10
# 切り替わったかを確認
$ which php
/Users/{ユーザー}/.phpbrew/php/php-7.2.10/bin/php
$ php -v
PHP 7.2.10 (cli) (built: Sep 14 2018 03:40:44) ( NTS )
Nginx をインストール
$ brew install nginx
デフォルトでは下記のような設定になっています。
- ポート: 8080
- ドキュメントルート: /usr/local/var/www
/usr/local/etc/nginx/nginx.conf
を編集します。
fastcgi_pass
に phpbrew のものを設定するのがキモです。
server {
listen 8080;
server_name localhost;
location / {
root /usr/local/var/www;
index index.html index.htm;
}
〜中略〜
location ~ \.php$ {
root /usr/local/var/www;
fastcgi_pass unix:/Users/{ユーザー}/.phpbrew/php/php-7.2.10/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
〜中略〜
Nginx の動作確認
PHP の対応はまだですが、ひとまず Nginx が動くか確認します。
$ nginx
http://localhost:8080/
にアクセスし、「Welcome to nginx!」という画面が出れば成功です。
Nginx をサービスとして自動起動させる
# 一度止める
$ nginx -s stop
# サービス登録
$ brew services start nginx
PHP-FPM で PHP を使えるようにする
確認用の適当なファイルを /usr/local/var/www/a.php
として作成します。
<?php phpinfo(); ?>
現在の状態で http://localhost:8080/a.php
にアクセスしても「An error occurred.」というエラーが表示されるだけです。エラーログを確認してみましょう。
2018/09/14 04:18:56 [crit] 97484#0: *5 connect() to unix:/Users/dada/.phpbrew/php/php-7.2.10/var/run/php-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /a.php HTTP/1.1", upstream: "fastcgi://unix:/Users/{ユーザー}/.phpbrew/php/php-7.2.10/var/run/php-fpm.sock:", host: "localhost:8080"
ちなみに下記のようなエラーが出ている場合は nginx.conf
の fastcgi_pass
が間違えている可能性が大きいです。
2018/09/14 00:54:04 [error] 48285#0: *37 kevent() reported that connect() failed (61: Connection refused) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /a.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost:8080"
PHP-FPM の起動
$ phpbrew fpm start
これにより /Users/{ユーザー}/.phpbrew/php/php-7.2.10/var/run/php-fpm.sock
が作成されます。
http://localhost:8080/a.php
にアクセスして、PHP の情報が表示されれば成功です。
PHP-FPM の自動起動
PHP が使えるようになりましたが、再起動すると PHP は使えなくなります。自動起動するようにしましょう。
~/Library/LaunchAgents/
に localhost.php.7.2.10.php-fpm.plist
を作成します。
参考:launchdで複数バージョンのPHP-FPMを自動起動する
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>localhost.php.7.2.10.php-fpm</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/Users/{ユーザー}/.phpbrew/php/php-7.2.10/sbin/php-fpm</string>
<string>--nodaemonize</string>
</array>
</dict>
</plist>
再起動すると http://localhost:8080/a.php
が見えるようになります。