PHP CLIで同じコマンドが実行中かどうかを調べる
cronなどで時間がかかるPHPスクリプトを使ったコマンドを実行する際、次の実行タイミングになっても終わっていなくて重複実行してしまうリスクがあります。
ヒント
※cronだけで重複起動防止する方法もあります
参考:cron実行スクリプトの多重起動防止ワンライナー
そんなときに「同じスクリプトが実行中(進行中)の場合はすぐに終了する」ということができれば良いですよね。
これを行う場合は以下のような関数を定義すると良いでしょう。
function check_mycmd_progressing() {
$mycmd = implode(' ', $_SERVER['argv']);
$cmd = "/bin/ps -e -o pid,args";
$fp = popen($cmd, "r");
while (($line = fgets($fp)) != false) {
if (strpos($line, $mycmd) !== false) {
$pid = intval(substr(ltrim($line), 0, strpos(ltrim($line), " ")));
if ($pid == getmypid()) {
continue;
}
return true;
}
}
fclose($fp);
return false;
}
説明すると、以下のようなことをやっています。
- 自身のコマンド名を取得
- 実行中のプロセスリストを取得
- while文でループしながら、自身のコマンド名と同じプロセスがあるかをチェック
- あった場合、それが今実行したコマンドプロセスではないかどうかをチェック
- 今実行したコマンドプロセスではないプロセスの場合、実行中であると判断してtrueを返す
- 何もなければfalseを返す
環境がLinuxで、PHP5.3以降であれば利用できます。
2021-12-17