<?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 ; } } ?>