MacでのPHP開発はphpbrewが非常に良い

2015年7月22日

phpbrew

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をインストールした

Mac に phpbrew で PHP7 をインストールした時のメモです。私の環境ではマニュアルの通りにやってもインスト ...

続きを見る

目次

  1. インストール事前準備
  2. phpbrew をインストール
  3. PHP5.6 をインストール
  4. PHPのインストールでエラーが出た時は
  5. PHP 拡張をインストールする
  6. PHP のバージョンを切り替える
  7. Nginx を設定する
  8. PHP-FPM を設定する
  9. php.ini を設定する
  10. OPcache を設定する
  11. 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 開発に必要な機能はひと通り備わっていると思います。お試しあれ。

-技術ブログ
-