PHP 抽選イベントにメモリ ロックを追加する原理は何ですか?
public functionacquire($key) {
//同時に 2 つのロックを取得する必要がある場合
if ( is_array($key) && count($key) == 2 ) {
while (TRUE) {
$res = 配列();
foreach($key as $k => $v) {
$res[$k] = $this->acquire($v);
if ( !$res[$k] ) {
壊す;
}
}
//最初のロックが取得できなかった場合は、直接戻ります
if ( !$res[0] ) {
$err = 新しい SysErr(システム::MEMCACHE_ACQUIRE_LOCK_ERROR);
ErrorHandle::throwErr($err);
elseif( !$res[1] ) {
//最初のロックを解放し、待ってから再試行してください
$this->release($key[0]);
usleep(LockConfig::LOCK_TIMEWAIT);
} それ以外 {
TRUEを返します。
}
}
} それ以外 {
$lock_key = LockConfig::LOCK_PREFIX 。
$i = 0;
する {
$lock = $this->_memcache->add( $lock_key, 1, LockConfig::LOCK_TIMEOUT );
//初めてロックを取得できなかった場合は、指定された時間待ってから再試行します。
if ($i > 0) {
usleep(LockConfig::LOCK_TIMEWAIT);
}
$i++;
//リトライ回数を超えたら終了
if ($i > LockConfig::LOCK_RETRY_TIMES) {
$err = 新しい SysErr(システム::MEMCACHE_ACQUIRE_LOCK_ERROR);
ErrorHandle::throwErr($err);
}
while( !$lock );
// ログを記録する
if ($i > 1) {
LogHelper::warning('lock.log', "ロック '{$lock_key}' を {$i} 回取得します");
}
$lock を返します。
}
}
/**
* メモリロックを解除します
*
* @param string $key メモリロックのプレフィックスを削除した後のキー値
* @return bool 正常に解放された場合は TRUE を返します
*/
パブリック関数リリース($key) {
$lock_key = LockConfig::LOCK_PREFIX 。
return $this->_memcache->delete($lock_key);
}
宝くじにはメモリーロックは必要ありません。 Redis キューまたはトランザクションを使用して、Mysql ロックを追加できる必要があります。 。
あなたが望むメモリロックがこれであるかどうかはわかりません:
$lock = new CacheLock('key_name');
//ここにロジック
$lock->unlock( );
CacheLock プロセス ロックは、主に、キャッシュが過剰な SQL リクエストのデータベースへの侵入を防ぐことができない場合の単一プロセスのキャッシュ取得に使用され、同時実行中の PHP のロック制御を解決し、ファイルを介してプロセス間ロックを実行します。そうでない場合、eaccelerator を使用してファイル ロックを処理し、対応するディレクトリに対応する粒度でロックを生成します。eaccelerator を使用すると、行と同様に、異なるロックが並行して実行されます。 mysql innodb の -level ロック。