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