<?php
// 排他ロッククラス
// exLock.php Version 1.02 written by fuku@rouge.gr.jp
//
// 使い方
// require_once("./exLock.php") ;
//
// $lock = new exLock("./lockPath.LCK") ;
// $lock->Lock() ;
// $lock->UnLock() ; // CGI から実行する場合は、なぜかデストラクタが効かない
class exLock {
private $lock_dir ; // ロックファイル
private $result ; // 自分でロックファイルを作成した印
function __construct($dirName) {
$this->lock_dir = $dirName ;
$this->result = False ;
}
public function Lock() {
// 3 分以上前に作成されたロックファイルを削除する
// ※何らかの原因で残ったままになったロックファイル
//
error_reporting(0) ; // filectime() で表示されるエラーを抑止する
try {
$ctime = filectime($this->lock_dir) ;
if ($ctime < (time() - 180)) {
rmdir($this->lock_dir) ;
}
} catch (Exception $e) {
}
error_reporting(1) ;
// ロックファイルを作成してみる
// ※5回やってダメなら失敗とする
//
$this->result = False ;
for ( $i = 0 ; $i < 5 ; $i ++ ) {
error_reporting(0) ; // mkdir で表示されるエラーを抑止する
try {
if (mkdir($this->lock_dir, 0777)) {
chmod($this->lock_dir, 0777) ;
$this->result = True ;
break ;
}
} catch (Exception $e) {
}
error_reporting(1) ;
time_nanosleep(0, 200000000) ; // 0.2 秒 sleep
}
return $this->result ;
}
public function UnLock() {
if ($this->result == True) { // 自分で作ったロックファイルなら消す
rmdir($this->lock_dir) ;
}
$this->result = False ;
}
function __destruct() {
if ($this->result == True) { // 自分で作ったロックファイルなら消す
rmdir($this->lock_dir) ;
}
$this->result = False ;
}
}
?>