昔はPHPの新しいバージョン出るたびに./configure && makeとかしてたもんだけど、すっかりめんどくさがりになってOSデフォのPHP使ってる昨今。

Padrino使い出してPowが便利ということを知り、常用しだしたんだけど、ちょっとPHPを使いたくなった時にめんどくさい。RackでPHPを動かすにはrack-legacyとか使えばいいんだけど、rack-legacyが呼ぶのはphp-cgi。Mac標準のPHPはApacheモジュールとcliは提供されているんだけどphp-cgiは入ってない。ということで、Homebrewでお手軽に入れてしまおうかと。

HomebrewにはPHPのFormulaが含まれていないのでリポジトリを足す必要がある。

$ brew -v 
Homebrew 0.9.2
$ brew search php
josegonzalez/php/php53 josegonzalez/php/php54 ...
$ brew tap josegonzalez/php
Cloning into '/usr/local/Library/Taps/josegonzalez-php'...
(中略)
Tapped 64 formula
$ brew search php
php53 php54 ...

とりあえずphp53を入れる。PHPのFormulaのコンパイルオプションを確認。

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

php-cgiが欲しいので–with-cgiが必須。あとはお好みで。

$ brew install php53 --with-cgi --with-mysql --with-intl --with-homebrew-openssl
Error: No available formula for zlib (dependency of php53)

怒られた。zlibどこよ?

$ brew search zlib
lzlib
homebrew/dupes/zlib

homebrew/dupesにいる。Mac標準パッケージに入ってるのはここに入るらしい。

$ brew tap homebrew/dupes
$ brew install php53 --with-cgi --with-mysql --with-intl --with-homebrew-openssl

opensslがどうのとWarningでた気がするけどキニシナイ。コンパイル長い。

Error: Failed executing: ./configure --prefix=/usr/local/Cellar/php53/5.3.15 ....

工エエェェ(´д`)ェェエエ工

解決策はHomebrew-PHPのREADME.mdにあった。てか、ここまでの手順がほぼそのまま書いてあった。

Mountain LionではX11が削除されたのでXQuartzを入れる必要があるらしい。ダウソしてインスコ。再度挑戦。

$ brew install php53 --with-cgi --with-mysql --with-intl --with-homebrew-openssl

通った。

$ php-cgi -v
PHP 5.3.15 (cgi-fcgi) (built: Aug  9 2012 07:42:30)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies

今回は使わないが、今コンパイルしたphpをApacheモジュールで使いたい場合はhttpd.confのLoadModuleを以下のように変更する。

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

さて、ようやくrack-legacyの出番。

$ gem install rack-legacy

PHPをRackアプリケーションとして動かすためにいろいろ準備。

$ mkdir /path/to/phpapp
$ cd /path/to/phpapp
$ mkdir public

public以下にphpファイルを置く感じに。

Gemfile

source :rubygems
gem 'rack'
gem 'rack-legacy'
gem 'rack-rewrite'

config.ru

require File.expand_path('../app', __FILE__)
run MyApp

app.rb

require 'rubygems'
require 'bundler'
Bundler.require

public_dir = File.expand_path('../public', __FILE__)

MyApp = Rack::Builder.app do
  use Rack::Rewrite do
    rewrite %r'(.*)/?', '$1/index.php', :if => lambda{|e|
      File.directory?(File.join(public_dir, e['PATH_INFO']))
    }
  end
  use Rack::Legacy::Php, public_dir
  run Rack::File.new(public_dir)
end

public/index.php

<?php echo "hello rack-legacy!" ?>

これで準備はおしまい。pow & powder使ってればpowder linkしてやればpow上でphpアプリケーションが動いていることを確認できる。

以上、brewで簡単に環境整えようと思ってたら意外に苦労したって話でした。