前回、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でもこのような処理が作れるようになったのを実感すると、
だいぶいろいろなシーンで使えるなと実感します。

お仕事のご依頼・相談を承ります
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら

Leave a Reply

お仕事のご依頼・相談
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら
ソフトウェア&ライブラリ




ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
執筆書籍
本、雑誌等

WEB記事:CodeZine
執筆記事はこちら
カレンダー
2009年5月
« 4月   6月 »
 123
45678910
11121314151617
18192021222324
25262728293031

カスタム検索
RSS
Add to Google < !–adsense–>
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ