hnwの日記

php-buildで複数バージョンのPHP-FPMを用意する


(2016/8/9)PHP7やHomebrewの現状に合わせるため細かい点を修正しました。


ついにPHP 5.5.0がリリースされましたね!これに関連して、php-buildを使ってPHP 5.3/5.4/5.5の3バージョンのPHP-FPM環境を用意する方法を紹介します。


この記事は「phpenv + php-build を使って 5.3 と 5.4 を共存させつつ php-fpm を使う - 肉とご飯と甘いもの @ sotarok」のアップデートのような内容になっています。ありがとうsotarok!

PHP-FPMとは

PHP-FPMはPHPのSAPI実装の一つで、単体で動作するアプリケーションサーバです。Apacheなしで動くので、気軽に扱えたりします。あまりうまく説明できないので、詳しくはPHP-FPM本家サイトあたりを見てください。

phpenv+php-buildのセットアップ

僕はphp-buildをphpenvプラグインとして使っていますので、この環境を作りましょう。まずphpenvをインストールします。

curl -L https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | bash


上記コマンドの終了時のメッセージに従い、.bashrcまたは.zshrcの末尾に次の2行を追加してシェルを再起動します。

PATH=$HOME/.phpenv/bin:$PATH # Add phpenv to PATH for scripting
eval "$(phpenv init -)"


次に、php-buildをphpenvのプラグインとしてインストールします。

mkdir $HOME/.phpenv/plugins
cd $HOME/.phpenv/plugins
git clone git://github.com/php-build/php-build.git


これでphpenvの機能が増え、「phpenv install [バージョン番号]」でPHPのインストールができるようになります。


詳しくは「phpenv+php-build環境の構築と運用」を参考にしてください。

php-buildでPHP-FPMをインストール

sotarok が記事を書いた頃と違い、php-buildは標準でPHP-FPMをビルドするようになりました。ですので、インストールは下記のようにタイプするだけです。

$ phpenv install 5.3.26
$ phpenv install 5.4.16
$ phpenv install 5.5.0


これで「$HOME/.phpenv/versions/[バージョン番号]/sbin/」に各バージョンのphp-fpmが作られます。

PHPの設定

この環境で使われるphp.iniは「$HOME/.phpenv/versions/[バージョン番号]/etc/php.ini」になります。毎度おなじみの下記設定を全部に追記しましょう。

date.timezone =Asia/Tokyo

PHP-FPMの設定

PHP-FPMの設定は「$HOME/.phpenv/versions/[バージョン番号]/etc/php-fpm.conf」で行います。


僕は次のように設定しました。これ以外の値はデフォルトを利用しています。

listen = 127.0.0.1:9053
listen.allowed_clients = 127.0.0.1
pm = ondemand
pm.max_children = 5


ポート番号はそれぞれ5.3を9053番、5.4を9054番、5.5を9055番にしました。また、同一ホストで起動するnginxからアクセスする前提ですので、localhostからの接続のみ許可しています。


ちなみに「pm=ondemand」はPHP-FPMの面白い機能で、普段はプロセス数を絞っておいて、忙しいときだけ子プロセスを増やしてくれるものです。商用環境で有用かどうかは疑問ですが、手元で起動するときはメモリを節約したいことが多いでしょうから、便利な機能だと言えそうです。

nginxのインストール・設定

PHP-FPMはFastCGIプロトコルしか受け付けてくれないので、ブラウザから利用するにはHTTPからFastCGIに変換してくれるサーバが必要です。このような場合、最近ではnginxを選ぶのが普通かと思います。


僕はHomebrewでnginxをインストールしました。

brew install nginx


Homebrewでインストールすると、設定ファイルの位置は /usr/local/etc/nginx/nginx.conf になります。下記のように、今回のphp-fpm用のバーチャルサーバ設定を追加します。

    server {
        listen 8080;
        server_name ~^php(?<phpver>\d\d).localhost$;
        set $port "90${phpver}";
        root /Users/hnw/Sites;
        index index.html index.php;
        location ~ \.php.*$ {
            fastcgi_split_path_info ^(.+\.php)(.*)$;
            fastcgi_pass 127.0.0.1:$port;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
            include fastcgi_params;
            fastcgi_param SERVER_NAME $host;
        }
    }


ドキュメントルートの位置は適宜修正してください。また、ドキュメントルートのパーミッションは755にする必要があります。


さらに、下記ホストが127.0.0.1を指すように/etc/hostsに登録します。


これで設定完了。nginxとPHP-FPMを手で起動すれば動作確認できます。

$HOME/.phpenv/versions/5.3.26/sbin/php-fpm --nodaemonize
$HOME/.phpenv/versions/5.4.16/sbin/php-fpm --nodaemonize
$HOME/.phpenv/versions/5.5.0/sbin/php-fpm --nodaemonize
/usr/local/opt/nginx/sbin/nginx -g "daemon off;"


毎回手動で起動するのはダルいので、次回は自動起動の設定を紹介します。