MacBookにPHP環境作ってみた

そういや自宅のMacBookにはPHP環境作ってないなーと思ったので作ってみた。
Mac OS Xには最初からApachePHPが入っているのだけど、モジュールとかどうなってるのかよくわからないし、せっかくなら最新版にしたいな、ということでソースからビルドしてみた。


ぐだぐだ書いても仕方ないので成功した内容しか書かないけど、PHPコンパイルがとにかくうまく行かなくて3日ぐらいはまってた。
1回10分ぐらいのコンパイルをトライ&エラーで両手でかぞえきれないぐらいやったのでもう疲れたよ……。

Apacheのインストール

まずはApacheのインストール。
ソースを落としてきてこんな感じにコンパイル&インストール。
付けるオプションはお好みで。とりあえずローカル開発用ってことで選り好みはhttpd.confですることにして共有ライブラリで全部入り*1にしてみた。

./configure \
--prefix=/usr/local/apache2 \
--enable-mods-shared="all ssl proxy dav-lock" \
--enable-static-support \
--with-mpm=prefork \
--with-included-apr
make
make install

httpd.confの設定とかは人それぞれ好みがあると思うので割愛。
標準のApacheは使う気がないので/usr/local/apache2/binにパス通して、sudo apachectl startで動作確認。
ポート1023以下はrootじゃないとbindできないので注意。


ここまではいつも通りで簡単な話だった……ここまでは。

PHPのインストール

さて、ここからが本番。
とりあえずつけたかったオプションに足りないライブラリを入れる。各自適当に。

  • libjpeg
  • libmcrypt
  • libxml2
  • icu4c

自分はhomebrewを使ってるのでbrewコマンドで入れた。
ただし他のライブラリはotool -Lで依存ライブラリを見るとフルパスになってるのに、icu4cだけは相対パスになってるようなので、DYLD_LIBRARY_PATHとかをいじらないとmake時や実行時にdylibが見つからない的なエラーが出る。

これは/usr/local/Cellar/icu4c/4.4.1/{lib,bin,sbin}あたりを片っぱしからotool -Lで確認しつつ、install_name_tool -idとか-changeで書き換えていくというしんどい作業で解決した。
なんか一括でやってくれるスクリプトとかどっかに転がってた。忘れたけど。


で、ようやくconfigureに入るんだけど、なんかこんな環境変数を設定しないとうまくいかないっぽい。

MACOSX_DEPLOYMENT_TARGET=10.6
CFLAGS="-arch x86_64 -g -Os -pipe -no-cpp-precomp"
CCFLAGS="-arch x86_64 -g -Os -pipe"
CXXFLAGS="-arch x86_64 -g -Os -pipe"
LDFLAGS="-arch x86_64 -bind_at_load"
EXTRA_CFLAGS="-lresolv"
EXTRA_LIBS="-lstdc++"

実際に叩いたコマンドはこんな感じ。
例によってオプションはお好みで。自分はとりあえずめぼしいのを共有ライブラリとして指定。一部うまくいかなかったのは静的に組み込んだ。
homebrewじゃない場合は$(brew --prefix foo)の部分は各自でパスを指定してね。

MACOSX_DEPLOYMENT_TARGET=10.6 \
CFLAGS="-arch x86_64 -g -Os -pipe -no-cpp-precomp" \
CCFLAGS="-arch x86_64 -g -Os -pipe" \
CXXFLAGS="-arch x86_64 -g -Os -pipe" \
LDFLAGS="-arch x86_64 -bind_at_load" \
EXTRA_CFLAGS="-lresolv" \
EXTRA_LIBS="-lstdc++" \
./configure \
--prefix=/usr/local/php-5.3.6 \
--with-config-file-path=/usr/local/php-5.3.6/etc \
--with-config-file-scan-dir=/usr/local/php-5.3.6/etc/php.d \
--with-apxs2=/usr/local/apache2/bin/apxs \
--enable-mbstring \
--enable-mbregex \
--enable-zend-multibyte \
--with-pdo-mysql=shared,mysqlnd \
--with-mysql=shared,mysqlnd \
--with-mysqli=shared,mysqlnd \
--with-mysql-sock=/var/mysql/mysql.sock \
--with-gd=shared \
--with-jpeg-dir=$(brew --prefix libjpeg) \
--enable-exif=shared \
--with-png-dir=/usr/X11 \
--with-zlib=shared \
--with-bz2=shared \
--enable-zip=shared \
--with-openssl=shared \
--enable-sockets=shared \
--with-curl=shared \
--enable-ftp=shared \
--with-mcrypt=shared,$(brew --prefix libmcrypt) \
--enable-bcmath=shared \
--with-libxml-dir=$(brew --prefix libxml2) \
--with-iconv=shared,/usr \
--enable-intl \
--with-icu-dir=$(brew --prefix icu4c)

でmake時にもこんなのがいるっぽい。

EXTRA_CFLAGS="-lresolv"

実際に叩いたコマンドはこんな感じ。

EXTRA_CFLAGS="-lresolv" make
EXTRA_CFLAGS="-lresolv" make install

ちなみにOSデフォルトのApacheに入れる場合は

  • /usr/libexec/apache2/libphp5.so

あたりが上書きされると思うので注意。やったことないからわからないけど。


無事インストールできたら、やっぱり標準の方は使う気がないので/usr/local/phpとかにリンク張って、こっちにパス通して、php.ini書いて、動作確認。

php -i

httpd.confに追加してphpinfo()とか書いて動作確認。

LoadModule php5_module        modules/libphp5.so
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
DirectoryIndex index.php index.html

*1:といいつつ、ldapとかは入れてないけど。