hnwの日記

launchdで複数バージョンのPHP-FPMを自動起動する


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


MacOSX上で5.3/5.4/5.5の3バージョンのPHP-FPMを自動起動する設定を紹介します。


各バージョンのPHP-FPMを用意する方法については、前回記事「php-buildで複数バージョンのPHP-FPMを用意する」を参照してください。

launchdについて

多くのUnix系OSでは、OS起動時の自動起動スクリプトがinit.dもしくはrc.dといったディレクトリ以下に存在しますが、MacOSXではlaunchdというデーモンで置き換えられています。さらに、launchdはユーザー権限で動くデーモン起動にも利用することができます。今回はこれを利用してユーザー権限でnginxとPHP-FPMを自動起動してみましょう。


実はlaunchdはcrondやxinetdの機能も実現している何でも屋さんです。詳しくは「man launchd」などを参照してください。

PHP-FPMの自動起動設定

launchdの個人用の設定ファイルは$HOME/Library/LaunchAgents/以下に設置します。


僕のPHP 5.3用の設定ファイル「localhost.php53.php-fpm.plist」は以下の通りです。

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>localhost.php53.php-fpm</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/hnw/.phpenv/versions/5.3.23/sbin/php-fpm</string>
        <string>--nodaemonize</string>
    </array>
  </dict>
</plist>


これを設置すれば次回以降のログイン時にPHP-FPMが勝手に起動するようになります。php-fpmのフルパスを書く必要がありますので、各自のホームディレクトリになるよう適宜書き換えてください。


PHP 5.4/5.5についても同様に作ります。ファイル名とLabelはそれぞれ適切に修正してください。

nginxの自動起動設定

nginxも一般ユーザー権限で自動起動させましょう。


Homebrewでインストールしたのであれば、「brew install nginx」で表示される案内に従って次のコマンドを打てば完了です。

$ brew services start nginx


こうすると、launchd管理でありながらHomebrewでも別途管理している状態になります。どうせならHomebrew側に全部寄せたい気もしますが、これは次回以降の宿題ということで今回はお茶を濁します。

launchd管理プログラムの起動方法・終了方法

上記のように設定してから再ログインすれば各プログラムが自動起動します。また、下記コマンドで明示的に終了させることができます(launchd管理から外れます)。

$ launchctl unload $HOME/Library/LaunchAgents/localhost.php55.php-fpm.plist


launchd管理から外れたagentを明示的に起動するには次のようにタイプします。

$ launchctl load $HOME/Library/LaunchAgents/localhost.php55.php-fpm.plist


また、launchd管理下のプログラムを一覧することもできます。

$ launchctl list | egrep '(php|nginx)'
48281	-	localhost.php55.php-fpm
48282	-	localhost.php54.php-fpm
48283	-	localhost.php53.php-fpm
48284	-	homebrew.mxcl.nginx
$


詳しくは「man launchctl」を参照してください。