そのスクリプト多重起動されたら困る
クーロンで定期的に実行される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'で半自動的に実行管理できると思う。まぁ、必要になったらやってみましょう。
--
あー、すきやき食べたい。