Archive for 2009/5/24
前回、phpでシグナルと名前付きパイプは有用だということを書きましたが、
もうちょっと調べてみました。
やりたいことは、
1) 同時に複数の処理依頼プロセスがある。
また、処理は大量のトランザクションがあり、バッチ的に処理されるものである。
2) 処理をするのは複数ではなく1つのプロセスで行いたい。
システムの負荷やら、そのあとの処理の関係上。。。。
3) 1は、2に対して処理を名前付きパイプで依頼する。
ここで依頼方法は1行テキストで依頼します。
さて、単純に行うには問題がなかったのですが、処理の中断を考えなければいけなくなりました。
そこで、シグナルの登場です。
1のプロセスも2のプロセスも、シグナルを受け取って中断。
そこまでは簡単にできるのですが、2が中断されたことを1(依頼プロセス)が把握できなければなりません。
そこで、依頼プロセスは、以下のようにプロセスIDを処理プロセスに伝えてあげます。
こんな感じです。
[PID] < 処理開始合図>
[POD] < 処理命令>
[PID] < 処理終了合図>
これで、2(処理プロセス)も、中断したときに依頼プロセスを知ることができるので、依頼側にシグナルを投げられるというわけです。
シグナルを受け付けるのはpcntl_signalで受け付けますが、シグナルを投げるのはposix_killです。
これらを組み合わせれば、処理を投げたら、処理完了のシグナルを受け付けるまで待つということができます。
さらにPHP5.3からはpcntl_sigtimedwaitという関数があるのでそれで待つことももできるようです。
ちなみに私はPHP5.1だったので、usleepを使ってループさせましたが・・・・
ちょっとWEBプログラムをやっているだけでは使わないとおもいますが、PHPではこのようなこともできるのです。
ちなみに、このようなことをやっても秒間1000ぐらいの処理はできました。
まあ、今回逆に秒間20程度に抑えたいので同期の機能もつけたかったのですが・・・・
あっ、そうそう、処理側で名前付きpipeを読むのにstream_selectをつかいました。
これもsocketを受け付けるサーバを作っていると使うのですが、PHPでもこのような処理が作れるようになったのを実感すると、
だいぶいろいろなシーンで使えるなと実感します。


