1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<?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);
}
}
?>