Mac で PHP のバージョンを複数管理する必要が出てきたので phpbrew をインストールしました。この手のツールは phpenv + php-build がデファクトっぽいですが、私の環境では phpenv が rbenv と干渉してうまく動かなかったので phpbrew を試してみました。これがなかなか使いやすかったのでご紹介。
phpbrew の使い方や実行したコマンド、Nginx + PHP-FPM + MySQL で開発するための設定や、OPcache、APCu、Xdebug のインストール方法をメモしておきます。
OS X El Capitan、OS X Yosemite で動作確認済みです。
2016年5月19日追記
この記事を書いてから 10 ヶ月後、PHP7 をインストールしてみたらエラーが出るようになっていました。解決策を以下の記事にまとめました。
-
MacにphpbrewでPHP7をインストールした
Mac に phpbrew で PHP7 をインストールした時のメモです。私の環境ではマニュアルの通りにやってもインスト ...
続きを見る
目次
- インストール事前準備
- phpbrew をインストール
- PHP5.6 をインストール
- PHPのインストールでエラーが出た時は
- PHP 拡張をインストールする
- PHP のバージョンを切り替える
- Nginx を設定する
- PHP-FPM を設定する
- php.ini を設定する
- OPcache を設定する
- PHP-FPM を起動・停止する
インストール事前準備
Homebrew で PHP のビルドに必要なパッケージをインストールします。
$ brew install automake autoconf curl pcre bison re2c mhash libtool icu4c gettext jpeg openssl libxml2 mcrypt gmp libevent
いくつかのパッケージを brew link
しておきます。
$ brew link curl --force
$ brew link icu4c --force
$ brew link libxml2 --force
$ brew link openssl --force
参考サイト
Requirement - phpbrew/phpbrew Wiki - GitHub
Trouble Shooting: Can't build PHP on OS X El Capitan
phpbrew をインストール
インストールは phpbrew の README の通りに進めます。README には日本語版もあります。
まずは、phpbrew のバイナリをダウンロードし、実行権限を与えて PATH の通ったディレクトリに置きます。私は /usr/local/bin
に置いてます。
$ curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
$ chmod +x phpbrew
$ mv phpbrew /usr/local/bin/phpbrew
phpbrew を初期化します。
$ phpbrew init
.bashrc や .zshrc に以下の行を追加し、ターミナルを再起動します。
source $HOME/.phpbrew/bashrc
PHP5.6 をインストール
インストール可能な PHP の一覧を確認します。マニュアルによると PHP5.3 より古いバージョンもインストールできるそうです。
$ phpbrew known
5.6: 5.6.11, 5.6.10, 5.6.9, 5.6.8, 5.6.7, 5.6.6, 5.6.5, 5.6.4 ...
5.5: 5.5.27, 5.5.26, 5.5.25, 5.5.24, 5.5.23, 5.5.22, 5.5.21, 5.5.20 ...
5.4: 5.4.43, 5.4.42, 5.4.41, 5.4.40, 5.4.39, 5.4.38, 5.4.37, 5.4.36 ...
5.3: 5.3.29, 5.3.28, 5.3.27, 5.3.26, 5.3.25, 5.3.24, 5.3.23, 5.3.22 ...
今回は PHP5.6.11 をインストールします。適宜最新版を選択してください。最終的に Nginx + PHP-FPM + MySQL で動作させる予定なので、いくつか configure オプションを指定します。
$ phpbrew install 5.6.11 +default +mysql +fpm +opcache +intl +iconv
+default は variants という記法で、configure オプションを指定するのに使います。有効な variants は phpbrew variants
コマンドで確認できます。
$ phpbrew variants
* php-5.6.11
Variants:
+mysql +fpm +opcache +intl +iconv +xml +bcmath +bz2 +calendar +cli +ctype \
+dom +fileinfo +filter +ipc +json +mbregex +mbstring +mhash +mcrypt +pcntl \
+pcre +pdo +phar +posix +readline +sockets +tokenizer +curl +openssl +zip
インストールの進行状況はログファイルで確認できます。エラーもここに出力されます。
$ tail -F /Users/karasawa/.phpbrew/build/php-5.6.11/build.log
PHPのインストールでエラーが出た時は
私の環境では以下のエラーが出て、インストールが止まりました。
# エラー1
configure: error: mcrypt.h not found. Please reinstall libmcrypt.
# エラー2
configure: error: Unable to detect ICU prefix or no failed. Please verify ICU install prefix and make sure icu-config works.
# エラー3
clang: error: linker command failed with exit code 1 (use -v to see invocation)
エラーメッセージや Troubleshooting - phpbrew/phpbrew Wiki - GitHub を見ながら足りないツールをインストールしました。
# エラー1対策
$ brew install mcrypt
# エラー2対策
$ brew install intltool icu4c
$ brew link icu4c --force
# エラー3対策
$ brew install curl icu4c libxml2
$ brew link curl --force
$ brew link icu4c --force
$ brew link libxml2 --force
インストール事前準備 で必要なツールをインストールしておけばエラーは出ないと思います。
PHP 拡張をインストールする
PHP 拡張をインストールする前に、インストールした PHP を利用するようにしておきます。
$ phpbrew switch 5.6.11
PHP 拡張をインストールするには、phpbrew ext
コマンドを使います。インストールした拡張は以下の通り。
$ phpbrew ext install xdebug latest
$ phpbrew ext install apcu latest
特定のバージョンを入れたい場合は phpbrew ext known
コマンドでバージョンを調べ、バージョンを指定してインストールします。
$ phpbrew ext known apcu
$ phpbrew ext install apcu 4.0.7
設定ファイルは ~/.phpbrew/php/php-5.6.11/var/db
にあるので適宜修正しましょう。
$ ls -l ~/.phpbrew/php/php-5.6.11/var/db
apcu.ini
xdebug.ini
PHP のバージョンを切り替える
一時的に PHP のバージョンを切り替えるには phpbrew use
コマンドを使います。
$ phpbrew use 5.6.11
デフォルトのバージョンを切り替えるには phpbrew switch
コマンドを使います。再起動後も同じバージョンになります。
$ phpbrew switch 5.6.11
phpbrew を使用するのをやめ、システムデフォルトの PHP に戻すには、phpbrew off
コマンドを使います。
$ phpbrew off
Nginx を設定する
インストールは brew install
コマンドで。
$ brew install nginx
nginx.conf を編集します。ログインユーザで nginx を起動できるようにポートは 8080 にしています。
- http のポートは 8080
- ドキュメントルートを ホームディレクトリ直下の www に
- PHP-FPM への接続は unix ソケット経由
worker_processes 1;
error_log /usr/local/var/log/nginx/error.log crit;
pid /usr/local/var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type text/html;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
root /Users/karasawa/www;
index index.html index.php;
access_log off;
server {
listen 8080;
server_name localhost;
location ~ \.php(/|$) {
fastcgi_index index.php;
fastcgi_pass unix:/Users/karasawa/.phpbrew/php/php-5.6.11/var/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
}
PHP-FPM を設定する
PHP-FPM の設定を行います。
- 実行ユーザはログインユーザにしたいので、user, group の設定をコメントアウト
- unix ソケットの PATH は nginx に書いたものと同じ
- 子プロセスは 1 個
- メモリリーク対策に pm.max_requests を設定
- catch_workers_output = yes を設定し、php.ini で指定した error_log にエラーが出力されるように
;user = nobody
;group = nobody
listen = /Users/karasawa/.phpbrew/php/php-5.6.11/var/run/php-fpm.sock
listen.mode = 0664
listen.allowed_clients = 127.0.0.1
pm = static
pm.max_children = 1
pm.max_requests = 500
catch_workers_output = yes
php.ini を設定する
default_charset = "UTF-8"
error_log = /Users/karasawa/.phpbrew/php/php-5.6.11/var/log/php_error.log
date.timezone = "Asia/Tokyo"
OPcache を設定する
OPcache を有効にするには、php.ini で opcache.so を追記する必要がありました。
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=4
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2
opcache.fast_shutdown=1
PHP-FPM を起動・停止する
PHP-FPM を起動・停止するには phpbrew fpm
コマンドを使います。
$ phpbrew fpm start
$ phpbrew fpm stop
まとめ
- phpenv と比べ、rbenv との干渉を気にしなくてよい
- マニュアルが充実している
- configure オプションをかなり柔軟に設定できる
- PHP 拡張もバージョンごとにインストール可能
ローカルでの PHP 開発に必要な機能はひと通り備わっていると思います。お試しあれ。