MemcacheLock.inc 2.24 KB
<?php
/**
 * Memcahceを利用したLockファイルの代わり
 * 同時に複数のサーバーで利用されることは考慮されていません。
 * また、memcacheの再起動によりリセットされるため、重要度の低いものにのみ、利用してください。
 * $Id: MemcacheLock.inc,v 1.1 2015/10/08 11:18:56 wanggb Exp $
 * @package jp.aimsweb.util
 */

class MemcacheLock {
	
	/**
	 * 対処のキーがロックされているか確認する。
	 * デフォルトは、有効期間無限 86400(1日)推奨
	 * @param $key
	 * @param $expire_seconds
	 */
	public static function isLocked($key, $expire_seconds = 0) {
		
		if (!AIMSWEB_USE_MEMCACHE) {
			trigger_error("MemcacheLock used with AIMSWEB_USE_MEMCACHE false");
			
			// 誤動作を防ぐために、ロックされていることにする
			return true;
		}
		
		$memcache = AimswebMemcacheManager::getInstance();
		
		$val = $memcache->get($key);
		ErrorLogger::doOutput("val:" . $val, 0);
		
		if ($val == null) {
			
			return false;
		}
		
		// 有効期間無限
		if ($expire_seconds <= 0) {
			return true;
		}
		
		// 文字以外の値がセットされている:たぶんデータが壊れている
		if (!is_numeric($val)) {
			return true;
		}
		
		$tmp = $val + $expire_seconds;
		
		// 有効期限が切れていた
		if ($tmp < time()) {
			
			return false;
		}
		
		// 期限内
		return true;
	}
	
	
	/**
	 * ロックをセットします。
	 * すでに値が合った場合も上書きします。
	 * @param $key
	 * @param $expire_seconds この、ロックが自動で外れる時間。isLockedの有効期間より優先される。
	 */
	public static function setLock($key, $expire_seconds = 0) {
		
		if (!AIMSWEB_USE_MEMCACHE) {
			trigger_error("MemcacheLock used with AIMSWEB_USE_MEMCACHE false");
			
		}
		
		$memcache = AimswebMemcacheManager::getInstance();
		
		$now = time();
		
		$memcache->set($key, $now, 0, $expire_seconds);
		
	}
	
	/**
	 * 対象のロックを解除します。
	 * @param $key
	 */
	public static function deleteLock($key) {
		
		if (!AIMSWEB_USE_MEMCACHE) {
			trigger_error("MemcacheLock used with AIMSWEB_USE_MEMCACHE false");
			
		}
		
		$memcache = AimswebMemcacheManager::getInstance();
		
		$memcache->delete($key);
	}
}

?>