HomebrewでPHP環境 現時点でのまとめ

MacでHomebrewを使ってPHPの開発環境を作るまとめです。

HomebrewはMacPortsより圧倒的にコンパクトなのがメリットです。MacPortsPHPをインストールすると、/opt/localに、Apacheを含め、すごい量のパッケージをインストールされます。PHPのビルドにApacheのライブラリが必要で、さらに、Apacheのビルドには...という具合。これだと、容量あたりの単価がかかるSSD搭載のMac bookがかわいそうですね。HomebrewのPHPは、MacOSApacheがあるのを知っているので、依存が浅くて軽いです。

MAMP.appがあるじゃないかという人はちょっと待った。あのパッケージ構造、httpd.confとphp.iniとmy.iniがどこにあるかすごくわかりにくいんですよね。そのうえ、使っている拡張の最新バージョン追従が個別にできないのは辛いです。

何よりHomebrewがいいのは、php54とphp53という個別のパッケージがあること。FuelPHPの仕事とBEAR.Sundayの趣味プロを同時にやりたいというとき、サクッと切り替えたり、php53を使っているときにphp54-xdebugのアップデートをしたり。

じゃあ、やり方いきますよ。

まずHomebrewのインストール

>Homebrew — MacPorts driving you to drink? Try Homebrew!

$ ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"

/usr/local/binにbrewコマンドができるので、シェルでパスを通しておきましょう。パッケージに含まれるコマンドはここに入ってきます。

うまくいったか環境チェックするにはこう。

$ brew doctor

あ、ちなみに最新のXCodeが要るのでMac AppStoreで調達しておいてくださいね。

実はMacについてくるApacheにはPHP5.3が付いてきます。Homebrewは「Macに最初から入っているものは含まない」というポリシーを守っていて、PHPは既存ソフト扱いなんだそうです。でも、アップデートされないわ、バージョン固定だわ、Xdebugは使えないわ、MySQLのドライバ入ってないわ、なんてPHPは使いたくないですよね。

そんなある日(2012年の4月ごろだったかな)、HomebrewにTapという機能が導入されました。外部のFormula(パッケージの定義)集を追加/管理するコマンドです。

https://github.com/mxcl/homebrew/wiki/Homebrew-0.9

これでオリジナルのFormulaと混ぜることなく、GitHubにある外部のFormulaセットを追加することが可能になります。たったこれだけ。

$ brew tap homebrew/dupes
$ brew tap josegonzalez/homebrew-php

削除は brew untap コマンドです。

事前に homebrew/dupes を追加しているのは、その一部に homebrew-php が依存しているためです。

さてこれで準備OKなのでお待ちかねPHPをインストール。

まずはどんなインストールオプションがあるかを確認します。

$ brew options php53
--without-bz2
	Build without bz2 support
--with-tidy
	Include Tidy support
--with-fpm
	Enable building of the fpm SAPI executable (implies --without-apache)
--with-cgi
	Enable building of the CGI executable (implies --without-apache)
--with-gmp
	Include GMP support
--with-intl
	Include internationalization support
--with-unixodbc
	Include unixODBC support
--without-pear
	Build without PEAR
--with-mssql
	Include MSSQL-DB support
--with-mysql
	Include MySQL support
--with-suhosin
	Include Suhosin patch
--with-mariadb
	Include MariaDB support
--32-bit
	Build 32-bit only.
--with-homebrew-openssl
	Include OpenSSL support via Homebrew
--with-pgsql
	Include PostgreSQL support
--with-imap
	Include IMAP extension
--without-apache
	Build without shared Apache 2.0 Handler module
--with-libmysql
	Include (old-style) libmysql support

intlがないとSymfonyに怒られるのでオン、あと、MySQLPostgreSQLのドライバも入れましょう。

$ brew install php53 --with-intl --with-mysql --with-pgsql

まだMySQLPostgreSQLをインストールしていない場合、MySQLPostgreSQLのインストールが始まります。分けてやってもいいのですが、記事を書くのが面倒なので依存を一気に入れちゃおうと...

やってみたらドライバだけはインストールされましたが、MySQL等の本体は別途インストールしないとだめでした。勝手に依存を入れるわけではなくなったようです。

インストール中にいろいろメッセージが出てきますが、まあ、最初はスルーしておきましょう。最後に出てくるPHPの設定ガイドだけしっかり見て下さい。

For 10.5 and Apache:
    Apache needs to run in 32-bit mode. You can either force Apache to start
    in 32-bit mode or you can thin the Apache executable.

To enable PHP in Apache add the following to httpd.conf and restart Apache:
    LoadModule php5_module    /usr/local/Cellar/php53/5.3.16/libexec/apache2/libphp5.so

The php.ini file can be found in:
    /usr/local/etc/php/5.3/php.ini

☆☆☆☆ PEAR ☆☆☆☆

If pear complains about permissions, 'Fix' the default PEAR permissions and config:
    chmod -R ug+w /usr/local/Cellar/php53/5.3.16/lib/php
    pear config-set php_ini /usr/local/etc/php/5.3/php.ini

☆☆☆☆ Extensions ☆☆☆☆

If you are having issues with custom extension compiling, ensure that this php is
in your PATH:
    PATH="$(brew --prefix josegonzalez/php/php53)/bin:$PATH"

Extensions will never be compiled against this homebrew-php PHP. Please install them
using --with-homebrew-php to enable compiling against this php.

☆☆☆☆ FPM ☆☆☆☆

If you have installed the formula with --with-fpm, to launch php-fpm on startup:
    * If this is your first install:
        mkdir -p ~/Library/LaunchAgents
        cp /usr/local/Cellar/php53/5.3.16/homebrew-php.josegonzalez.php53.plist ~/Library/LaunchAgents/
        launchctl load -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php53.plist

    * If this is an upgrade and you already have the homebrew-php.josegonzalez.php53.plist loaded:
        launchctl unload -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php53.plist
        cp /usr/local/Cellar/php53/5.3.16/homebrew-php.josegonzalez.php53.plist ~/Library/LaunchAgents/
        launchctl load -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php53.plist

Mountain Lion comes with php-fpm pre-installed, to ensure you are using the brew version you need to make sure /usr/local/sbin is before /usr/sbin in your PATH:

  PATH="/usr/local/sbin:$PATH"

You may also need to edit the plist to use the correct "UserName".

Please note that the plist was called 'org.php-fpm.plist' in old versions
of this formula.

php.ini は /usr/local/etc/php/5.3/php.ini です。5.4 だとこれが php/5.4/php.ini になります。

Apache にロードするには /etc/apache2/httpd.conf あたりにこんな感じで追加します。Apacheは homebrew/dups でビルドしてもいいですね。今は簡単に MacOS の標準に入れておきましょう。

#LoadModule php5_module libexec/apache2/libphp5.so
LoadModule php5_module    /usr/local/Cellar/php53/5.3.16/libexec/apache2/libphp5.so

PEARを使うために、手動でこんな操作が必要らしいのでやっておきましょう。パーミッションが書き込みできないようになってて、pear がうまくいかないのです。忘れるとマジでハマります。

$ chmod -R ug+w /usr/local/Cellar/php53/5.3.16/lib/php
$ pear config-set php_ini /usr/local/etc/php/5.3/php.ini

え、こんなの全部憶えられない? って、エディタにコピーなんかしとかなくても大丈夫ですよ。コマンドでもう一度表示させることができるので、設定が済んだら忘れていいですよ。

$ brew info php53

ほら。

これで、MySQLPostgreSQLの設定も確認できます。一括でインストールして読み飛ばしてもいいよというのはそういう意味。

$ brew info mysql
$ brew info postgresql

Hello Worldやるぶんには使わないので、あとでこれ見て勝手にやっといてください。

$ php -r 'echo "Hello World\n";'

はいこんにちは。

あと、開発するなら必須な拡張をいくつかインストール。何はなくとも、XdebugとAPCは要りますよね。

$ brew install php53-xdebug --with-homebrew-php
$ brew install php53-apc --with-homebrew-php

おしりの --with-homebrew-php がポイントです。これを付けないと、MacOSのデフォルトのPHPをリンクしてしまったり、5.4用の拡張なのにカレントの5.3をリンクしたり、という現象が起こりかねません。これを指定することで、必ず、Homebrewのphp53をリンクするようになります。(php-build等で勝手インストールしたランタイムとリンクしたい人のために、デフォルトは遠慮してるそうです)

追記ここから

$ brew install php53-xdebug
$ brew install php53-apc

2012-10-08から、オプションの指定が逆になったようです。--without-homebrew-php で、homebrewのPHPをできるだけ避けてビルドするようにし、何も指定しなければhomebrewの対応するバージョンのPHPを使うのがデフォルトになっています。なのでオプションに注意しなくてもOKです。

ここまで

あ、ちなみにこれ、今日やっと正常に動作したホットな機能です。ここ修正されたのが、このエントリを書いてる動機です。

https://github.com/josegonzalez/homebrew-php/issues/151
https://github.com/josegonzalez/homebrew-php/issues/297

XdebugとAPCのインストールが済むと、便利なことに、/usr/local/etc/php/5.3/conf.d/ext-xdebug.ini と /usr/local/etc/php/5.3/conf.d/ext-apc.ini ができました。とりあえず初期設定のまま使うぶんには、 php.ini の修正はしなくていいです。

ふー、あともう一歩、PEARで開発に必須なものを入れます。

$ pear config-set auto_discover 1
$ pear install pear.phpunit.de/PHPUnit
$ pear install PhpDocumentor
$ pear install pear.phing.info/phing

まあこれぐらいあればまずはいいでしょう。パーミッションでハマらないように。

PEARでツールをインストールしたときは、もうひとつハマりどころがあります。インストールが成功してもすぐにはコマンドが使えないんですよね。Homebrewでインストールしたコマンドの正体は、/usr/local/binの中に置かれたシンボリックリンクなんですが、PEARを初めて使う前にもう、それ済んじゃってますよね。というわけで、シンボリックリンクを作り直します。

$ brew unlink php53
Unlinking /usr/local/Cellar/php53/5.3.16... ?? links removed
$ brew link php53
Linking /usr/local/Cellar/php53/5.3.16... ?? symlinks created

完了。phpunit も phing も使えるようになりました。

じゃあ、php54 も同じ要領でインストールしましょう。できますよね、3が4になるだけですよ。

〜時間がかかるのでこちらに出来上がったものがございます〜

5.3と5.4の切り替えは、Cellerに直接パスを通してやるのもいいけど、

# export PATH="$(brew --prefix josegonzalez/php/php53)/bin:$PATH"
export PATH="$(brew --prefix josegonzalez/php/php54)/bin:$PATH"

Homebrewのbinにあるリンクを再設定する方法だと、 .bash_profile を編集する必要もなくてラクラクです。

5.4 -> 5.3

$ brew unlink php54
$ brew link php53

5.3 -> 5.4

$ brew unlink php53
$ brew link php54

仕事中にこっそり裏でビルトインサーバとかBEAR.Sundayとかぐへへ...

そうそう、定期的にパッケージの更新は、やったほうがいいですよ。

$ brew update
$ brew outdated
$ brew upgrade

$ brew unlink php53; brew link php54
$ pear list-upgrades
$ pear upgrade

$ brew unlink php54; brew link php53
$ pear list-upgrades
$ pear upgrade