1プロセスだけが実行されることを保証するクラスを作った(PHP)

cronにジョブを登録して、バックグランドで定型処理を実行することをよくやるかと思います。
その時に必ず一つのプロセスだけが実行されることを保証したい時があります。
こういう時にみなさんはどのようにやっているでしょうか。

案1: cronに時間間隔をある程度あけて実行する

毎分実行するとかじゃなくて、5分くらい間隔を開けて実行するようにする。
5分以内に処理が終われば、複数プロセスで実行されることはありません。
cronの設定をちょこっと変えるだけで簡単にできます。
でも、こういうことするとメンテナンスが面倒だし、いつの間にか複数プロセスが立ち上がってたりするんですよね ToT

案2: ロック処理をいれる

ロック処理を入れて、ちゃんと排他処理してやれば大丈夫です。
ただ個人的な感覚でしかないんですが、排他処理をまともに書ける人って想像以上に少ない気がする。
基本的なプログラミングではあるとは思うのですが。
あとスクリプトが増えてくると統一されてないいろんなやり方で実装されてたりして、だんだんメンテナンスが大変になってくる。

案3: daemontoolsのsetlockを使う

これはかなりおすすめ。
setlockを使うと簡単に実現できます。
個人的にはdjbのソフトウェアはライセンスがアレゲなので、ほとんど使いませんが。
daemontoolsはバイナリ提供できないので、インストールがちょっと面倒かもしれません。

singleExecution作った

もっと簡単に実現できたらいいなと思ってsingleExecutionなるクラスを作ってみました。
codereposに登録したので、よかったらどうぞ。

single_execution.php

使い方

プログラムの先頭で、require して new するだけです。
同じプロセスが実行されてない場合は、続きの処理を実行しますが、既に他のプロセスで実行されてた場合は直ちに終了します。

require_once('single_execution.php');
new singleExecution();

例えば

時間のかかる処理を常に実行しておきたい。

プログラムの先頭で singleExecution を呼び出す。

require_once('single_execution.php');
new singleExecution();

cron には毎分実行するように登録。

* * * * * php /path/to/command/foo.php

どんなに時間のかかる処理だろうが、実行されるプロセスは1つだけ。

トラックバック(3)

このブログ記事を参照しているブログ一覧: 1プロセスだけが実行されることを保証するクラスを作った(PHP)

このブログ記事に対するトラックバックURL: http://blog.bz2.jp/bz2mt/mt-tb.cgi/259

昨日作ったsingleExcutionですが、思いのほか好評なようでよかった。^... 続きを読む

ベイエリア情報局 - pseudoQueue作った(PHP) (2008年5月 5日 20:46)

メッセージキューとは 異なる処理の間でキューを用いてメッセージ交換を行う仕組みの... 続きを読む

1プロセスだけが実行されることを保証するクラスを作ったPHP - ベイエリア情報局 cronでphpスクリプトを回すこと、私はよくやりますが、その1回の処... 続きを読む

コメント(2)

djbさんのソフトウェアはqmail, djbdns, daemontoolsなどパブリックドメインになってますよ。
http://cr.yp.to/distributors.html

各ディストリビューションにパッケージがあるかはわかりませんが。

そうだったんですね!!
知りませんでした。

手元のcentos 5(?)だとパッケージはありませんでした。
パッケージとして提供されるのも時間の問題かもしれないですね。

ウェブページ

Powered by Movable Type 4.21-ja

このブログ記事について

このページは、masatoが2008年5月 4日 15:34に書いたブログ記事です。

ひとつ前のブログ記事は「LLはコンパイルして入れる」です。

次のブログ記事は「どこでもsymfonyコマンド実行できるようにするのって流行ってるの?」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。