最近のプロジェクトにそのようなシナリオがあります
1. ファイルを生成するとき、複数のユーザーが生成権限を持っているため、同時実行を防ぐために、生成された結果にエラーが発生するため、生成プロセスをロックし、次の場合にのみ許可する必要があります。ユーザーが一定期間内に操作を実行すると、操作プロセスをロックするためにロックが必要になります。
2. キャッシュを使用する場合、キャッシュの障害により、ほとんどの同時リクエストが瞬時にデータベースに侵入する可能性があります。同じ同時プロセスでこの操作をロックするには、ロックを使用する必要がある場合もあります。
上記の 2 つの状況の場合、現在の解決策は、処理プロセスにロック メカニズムを実装することです。これは、PHP を通じて実装されます。
Eaccelerator のメモリ ロックとファイル ロックが使用されます。原理は次のとおりです。
システムに EAccelerator がインストールされているかどうかを確認します。インストールされていない場合は、ファイル ロックを使用します。 >これは、取り込まれたさまざまなキーに従って実装できます。 Innodb の行レベルのロックと同様に、複数のロックの直接並列処理
は次のように使用されます:
$lock = new CacheLock('key_name' );
$lock->lock();
// ここでのロジック
$lock->unlock();
// 使用中はファイルがロックされているパスに注意してください
特定のクラスは次のとおりです:
コードをコピーします コードは次のとおりです:
/**
* CacheLock プロセス ロック。主に、キャッシュが失敗した場合の単一プロセスのキャッシュ取得に使用され、過剰な SQL リクエストがデータベースに侵入するのを防ぎます。
* ファイル/アクセラレータを通じて、同時実行中の PHP ロック制御を解決するために使用されます。プロセス間ロック
* eaccelerator を使用しない場合、ファイルのロック処理が実行され、対応するディレクトリに対応する粒度のロックが生成されます
* eaccelerator を使用する場合、処理はメモリ上で実行されます。パフォーマンスは比較的高くなります
* mysql innodb の行レベルのロックと同様に、さまざまなロックが並行して実行されます
* このクラスは、sunli の phplock http://code.google.com/p に基づいてわずかに変更されています/phplock
* @ 著者 yangxinqi
*
*/
class CacheLock
{
//ファイルロック保存パス
private $path = null;
private $fp = null;
//ロックの粒度、設定が大きいほど粒度は小さくなります
private $hashNum = 100;
//キャッシュ キー
private $name; 🎜>//eaccelerator フラグが存在するかどうか
private $eAccelerator = false;
/**
* コンストラクター
* 同時実行を実行できるように、ロックのストレージ パスとキャッシュ キーの名前を渡します
* @param string $path " で終わるロックのストレージ ディレクトリ/"
* @param string $name キャッシュ キー
* /
public function __construct($name,$path='lock\')
{
//eAccelerator が存在するかどうかを判断します。ここで eAccelerator を有効にすると、効率を向上させるためにメモリ ロックを実行できます
$this->eAccelerator = function_exists("eaccelerator_lock");
if(!$this) ->eAccelerator)
{
$this->path = $path.($this->_mycrc32($ name) % $this->hashNum).'.txt'; }
$this->name = $name;
}
/**
* crc32
* crc32 封装
* @param int $string
* @return int
*/
プライベート関数 _mycrc32($string)
{
$crc = abs (crc32($string));
if ($crc & 0x80000000) {
$crc = 1;
$crc; }
/**
* ロック
* ここに説明を入力してください ...
*/
public function lock()
{
//それができない場合は、EA メモリ ロックをオンにし、ファイル ロックをオンにします。
if( !$this->eAccelerator)
{
// ディレクトリのアクセス許可を書き込み可能に設定します
$this->fp = fopen($this ->path, 'w '); if($this->fp === false)
{
return false;
return flock($this->fp,
}else{
return eaccelerator_lock($this->name);
}
}
/**
* ロックを解除
* ここに説明を入力してください ...
*/
public functionunlock()
{
if(! $this->eAccelerator)
{
if($this->fp !== false)
{
flock($ this->fp,
clearstatcache); ();
}
//Close
fclose($this->fp);
return eaccelerator_unlock($this->name);
}
}
このクラスは、Sun Li のクラスに基づいて少し改良されています。詳細については、http://code.google.com/p/phplock を参照してください。彼の分かち合いの精神に感謝します。