この記事では、PHP で Memache をプロセス ロックとして使用する操作クラスの共有を主に紹介し、クラスの実装コードとアプリケーション例を示します。ダウン
を参照してください。
?
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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
//Memache をプロセス ロックとして使用する
クラスロック_プロセスロック{
// キーのプレフィックス 保護された$sLockKeyPre; //再試行間隔 保護された$iLockRetryInterval; //再試行回数 保護された$iLockRetryCount; //ロックの有効期限 保護された$iLockCacheTimeout; //ロック期限切れ後のコールバック関数 保護された$onLockTimeoutFunc; //memache のインスタンス 保護された$oMemcache; //ストレージ memcache 障害後の再試行回数 保護された$iMemcacheRetryCount;
パブリック関数 __construct ($onLockTimeoutFunc=NULL) { $aLockConfig = get_config('', 'lock'); $this->sLockKeyPre = self::LOCK_KEY_PRE; $this->iLockRetryInterval = self::LOCK_RETRY_INTERVAL; $this->iLockRetryCount =self::LOCK_RETRY_COUNT; $this->iLockCacheTimeout = self::LOCK_CACHE_TIMEOUT; $this->iMemcacheRetryCount = self::LOCK_CACHE_TIMEOUT; if(!$onLockTimeoutFunc){ // ロックが失敗した場合は、コールバック関数を呼び出します。コールバック関数がない場合は、このクラスで提供される を使用します。$onLockTimeoutFunc ='onLockTimeout' ; } $this->onLockTimeoutFunc = $onLockTimeoutFunc; }
/** memcacheサーバーに接続します */ パブリック関数 connect() { if (! isset ( $this->oMemcache )) { $this->oMemcache = 新しい Memcache (); $this->oMemcache->connect ( '127.0.0.1', 11211 ); } $this->oMemcache を返す; }
/* MeMcacheにキーを追加 */ public addMemcache($sKey, $sValue, $iTimeout){
for($i= 0 ; $i<$this->iMemcacheRetryCount){ $bRes = $this->oMemcache->add($sKey, $sValue, $iTimeout); if($bRes){ true を返す ; } // ロックが失敗した場合は、スリープして再ロックします usleep($this->iLockRetryInterval*1000);
} false を返す ;
}
/* ロックされました */ 公開関数ロック($sLockID){
$oMemcache = $this->connect(); $sKey = $this->sLockKeyPre ;
// ロックが失敗した場合は、さらに数回試すことができます
for($i = 0; $i iLockRetryCount; $i++){
// ここで設定した値は任意に設定可能です if($this->addMemcache($sKey,'1',$this->iLockCacheTimeout)){ true を返す ; }
// ロックが失敗した場合は、スリープして再ロックします usleep($this->iLockRetryInterval*1000);
}
// それでも失敗する場合、ロックは失敗し、失敗後に処理する必要があるコールバック関数が呼び出されます 。if(is_callable($this->onLockTimeoutFunc)){ //関数呼び出し call_user_func($this->onLockTimeoutFunc); }
}
/* ロック解除操作 */ 公開関数ロック解除($sLockID){
$oMemcache = $this->connect(); $sKey = $this->sLockKeyPre . //削除キーreturn $this->oMemcache->delete($sKey);
}
/** ロックに失敗した場合は、以下の操作を行ってください */ パブリック関数 onLockTimeout(){
echo (「ロックタイムアウト」); }
}
//応用例
$oLock = 新しいlock_processlock(); $lockResource = "テスト"; // ロック $oLock->lock($lockResource); // ロックを解除する
|