btoメモ

なんか適当に書く

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つだけ。