前回のPHPで書いたGearman_Workerのプログラムをバックグラウンドで動かそうとするとプロセスが止まってしまう件ですが、これを解決する方法を探していて見つけたのが、PEARのSystem_Daemonというモジュールです。
これは要するに、PHPでデーモンみたいな動きをするプログラムを書けるよ! というマニアックなモジュールで、これを使えばPHPのCLI版のプログラムをバックグラウンドで動かし続けることが可能になります。個人的にはPHPはプロセス制御するには(perlなどと比べると)不向きな言語だと思っているので、よくこんなのPHPで作ったよなあという感じ。
System_Daemonを使ってWorkerを動かすようにしたのが以下のプログラムです。
gearman_worker.php
#!/usr/bin/php -q < ?php ini_set('include_path', ini_get('include_path').':..'); error_reporting(E_ALL); require_once "System/Daemon.php"; require_once 'Net/Gearman/Worker.php'; System_Daemon::setOption("appName", "Gearman_worker"); System_Daemon::setOption("appDir", dirname(__FILE__)); System_Daemon::start(); $servers = array('localhost:7003'); try { $worker = new Net_Gearman_Worker($servers); $worker->addAbility('hello'); $worker->beginWork(); } catch (Net_Gearman_Exception $e) { System_Daemon::log(System_Daemon::LOG_INFO, $e->getMessage()); } System_Daemon::stop(); ?>
実行すると、System_Daemon::start() の後に書いたコードがバックグラウンドで実行されます。
実行時には(ubuntuでは)/var/log配下にログファイル(この場合はGearman_worker.log)を作るので、ここにアクセスするためにスクリプトはroot権限で実行する必要があります。
またSystem_Daemonには、/etc/init.d/ にプロセスの起動・終了スクリプトを自動的に作ってくれるちょっとお茶目な機能もあります。スクリプトの作り方はSystem_Deamonのサイトに詳しく書かれているので、必要に応じてどうぞ。面白いモジュールですね。
なお、ここまで書いておいて何なのですが、業務システムで使うならWorkerはやっぱり枯れているperlで書いた方が安全だよなあという気持ちになっています(オチ)。