そのスクリプト多重起動されたら困る

クーロンで定期的に実行されるPHPスクリプトがあるんだけど、処理が長引くと多重起動しちゃう。
それは困るのでPIDファイルを利用しましょうって話。
PIDファイルってのは今回の場合、自分自身のプロセスIDを記述した、ただのファイルです。


実装してみる

<?php

/*PIDファイル名*/
$pid_file = "process.pid";

/**
 * PIDファイルの確認と作成
 */
if(file_exists($pid_file)){
	$_pid = trim(file_get_contents($pid_file));
	system("kill -s 0 {$_pid}", $_status);
	if($_status){
		unlink($pid_file);
		echo 'NOTICE: プロセスの存在しないPIDファイルを削除しました。';
	}else{
		die('ERROR: 既存のプロセスが実行中です。');
	}
}
system('echo '.getmypid().' > '.$pid_file, $_status);
if($_status){
	die('ERROR: PIDファイルの作成に失敗しました。');
}


/**************************
 *
 * ここにメインスクリプト
 *
 *************************/


/**
 * PIDファイルの削除
 */
unlink($pid_file);

手抜きで環境が限定的な感じになってますが、流れとしてはこんなんでいいのかなと。

プロセスIDが存在するかどうか調べるのは
system("kill -s 0 {$_pid}", $_status);
とか、
system("ps {$_pid} ", $_status);
とかで、返ってくるステータスを見ればいい。
上記の場合だと '0' が返ってくるとそのプロセスが存在していることになる。'1' 以上が返ってくる場合は、そのプロセスが存在しないか、コマンドで何らかのエラーが発生している。

とりあえずこれで、前のプロセスが残っているときは処理を実行しなくなる。


まとめ

直に書くと、なんだかもっさりしますが、クラス化しちゃえば、'__construct'や'__destruct'で半自動的に実行管理できると思う。
まぁ、必要になったらやってみましょう。


--
あー、すきやき食べたい。