eseChildProcess †
eseChildProcessとは †
eseChildProcess(the ESe is Essence of Child Process)はすべてPHPによって書かれた子プロセス生成用クラスライブラリです。
PHP5以降の環境において、メソッド呼び出しによる子プロセスの自動生成を目的に作りました。
たとえば、とても時間のかかる処理を子プロセスとして実行し、結果を非同期で受け取ることなどができます。
開発のいきさつ †
なにも考えずにWEBサイトでDBを絡めたプログラムをつくっていると、ときどきSQL文が非効率的なのか、テーブルレコードが巨大になってしまったせいなのか、はたまたindexの作り方がわるいのか、、、なにしろ、えらく時間のかかってしまう処理になってしまうことがあります。
ええ、これはもちろん、「設計が悪い」、「コーディングがへたくそ」と、言われてしまえば言い返すこともできないのですが、いわゆる運営側で使う管理ツールなどではどうしても扱うDBのサイズが大きくなりますし、検索条件なども複雑になってしまい、それに合わせてSQL文も複雑になるので、設計当初、目論んでいたよりも重い処理になってしまいます。
そうなるとWEBサーバ側もしくはブラウザ側がタイムアウトしてしまい、結局使えない。。。なんてことも発生してしまいます。
ループの回数が多いなど、自らのプログラムの処理が重い場合は、逃げの手法としてループ処理の中に嘘のhttpdを送ったりしています。
while ($flag) {
:
:
// なんか処理
:
:
print("<!-- dummy -->"); <---- ダミーなタグを送ってタイムアウトを回避
if (xxx) {
$flag = false;
} else {
$flag = true;
}
}
しかし、1つのSQL文のDBアクセスが重くてタイムアウトしてしまう場合などは、もうお手上げで、このような逃げの手が打てません。結局、SQL文の見直しやDB側の処理速度向上などを行い、なんとかしなければなりません。
よく「特定のメソッドだけ別プロセスで動けばなぁ。。。結果は非同期で返せればなぁ。。。」と思ってました。
それで、PRMPを作ったときに非同期で結果を返すような仕組みを考えていたので、それを単独でクラス化したのがこのeseChildProcessです。
なんか、PRMP公開以後、アクセス数が増えてしまい、私は調子コイてるようなので、盲目に公開してみます(笑。
反省ならサルでもできる...。
特徴 †
- シンプルで(たぶん)軽量。
- (大それたことに)Java Thread classを意識したメソッド群
- 子プロセスになると、1つのメソッドしか呼ばないので理解しやすい。(と思う)
- 子プロセスから親プロセスに値を渡すことができるようにもコーディング可能。(サンプル参照)
- オープンソース。
動作要件 †
- PHP 5以上 (PHP4では動きません)
- PHPのPCNTL関数を利用するのでコンパイル時に configureでオプション -with-pctrl を使用すること。内部ではPOSIX関数も利用しているが、POSIX関数はconfigureデフォルトではON。また付属のサンプルコードではXML-RPCを使っているのでこれを動かすのならば -with-xmlrpcも使用すること。
動作確認済み環境 †
CentOS 5 + PHP 5.2.6
(これ以外の環境で動かしたことはありません)
PHP5の機能を使っているのでPHP4では動きませんが、大した機能をつかっているわけではないので、たぶん多少書き換えれば動くんじゃないかと思います。
ダウンロード †
2008.07.28 リリース版 download
ファイル構成 †
eseChildProcess.inc
クラス本体
sample_normal.php
子プロセスを生成したのち正常に処理を終わらせ、子プロセスから実行結果を取得する実行サンプル。CLI用。
sample_stop.php
子プロセスを生成したのち処理の途中で強制的に子プロセスを破棄する実行サンプル。CLI用。
sample_idle.php
子プロセから親プロセスに随時値を送る実行サンプル。CLI用。
利用方法 †
こちらを参照。
著作権 †
現在、配布しているeseChildProcessのプログラム、ドキュメント類の著作権はすべてohnetaに帰属します。
利用条件 †
下記、「免責について」を了承のうえご利用ください。
また、配布ライセンスはとりあえずBSDライセンでお願いします。
のちのち変更するかもしれませんが。。。
免責について †
eseChildProcessに関連する人物(作者、配布者等)は、あなたがeseChildProcessを利用したことに関連して生ずる損害について、一切責任を負いません。eseChildProcessの利用は、利用者の責任で行ってください。
また、eseChildProcessの配布物およびそれに関連する全てのドキュメント、webページ等は、あなたのコンピュータやソフトウェア、データ、通信回線や通信機器などに損害が発生しないことを一切保証しません。もし、障害が発生しても一切責任は負いません。
これらをご了承のうえ、eseChildProcessをご利用ください。また、この内容に不満、不服がある場合はeseChildProcessの利用はご遠慮ください。
ご意見ご感想はこちら †
e-mail : ohneta@gmail.com
↑@が全角の「@」になってますので、修正してからお送りください。
履歴 †
2008.07.28 eseChildProcess.release.2008.07.28.tgz 公開 / pukiwikiページ公開~