最近のプロジェクトではそのようなシナリオがあります
1. ファイルを生成するとき、複数のユーザーが生成権限を持っているため、同時実行を防ぐために、生成された結果にエラーが発生するため、生成プロセスをロックする必要があり、1 人のユーザーのみがロックされます。一定期間内に操作するには、この時点でロックを使用して操作プロセスをロックする必要があります。
2. キャッシュを使用すると、ほとんどの同時リクエストが瞬時にデータベースに侵入する可能性があります。同じ同時プロセスでこの操作をロックするには、ロックを使用する必要があります。
上記の 2 つの状況の場合、現在の解決策は、次のように PHP を介して実装されるロック メカニズムを処理プロセスに実装することです。
Eaccelerator のメモリ ロックとファイル ロックを使用する原理は次のとおりです。
EAccelerator がシステムにインストールされているかどうかを判断し、インストールされていない場合は、ファイル ロックを実行します。 Innodb の行レベルのロックと同様に、直接並列処理できます。
$lock = new CacheLock('key_name');
//logic here
$ lock->unlock();
//使用中に注意する必要があります ファイルロックが配置されているパスには書き込み権限が必要です
具体的なクラスは次のとおりです:
コードをコピーします。コードは次のとおりです:
/*** CacheLock プロセス ロック。主に、キャッシュが失敗した場合の単一プロセスのキャッシュ取得に使用され、過剰な SQL リクエストがデータベースに侵入するのを防ぎます。* 同時実行中の PHP ロック制御を解決し、ファイル/アクセラレータを介してプロセス間ロックを実行するために使用されます
* eaccelerator を使用しない場合、ファイルのロック処理が実行され、対応するディレクトリに対応する粒度のロックが生成されます
* eaccelerator を使用すると、メモリ上で処理され、比較的高いパフォーマンスが得られます
* innodb の行レベルのロックと同様に、さまざまなロックが並行して実行されます
* このクラスは、sunli の phplock http://code.google.com/p/phplock に基づいてわずかに変更されています
* @author yangxinqi
*
*/
class CacheLock
{
// ファイルロックの保存パス
private $path = null
// ファイルハンドル
private $fp = null;
//ロックの粒度、設定が大きいほど粒度は小さくなります
private $hashNum = 100;
//eAccelerator フラグが存在するかどうか
/**
* コンストラクター
* 同時実行を実行できるように、ロックのストレージ パスとキャッシュ キーの名前を渡します
* @param string $path "/" で終わるロックのストレージ ディレクトリ
* @param文字列 $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;
}
/**
* ロック
* ここに説明を入力してください ...
*/
public function lock()
{
//EA メモリ ロックを開けない場合は、ファイル ロックを開きます
if(!$this->eAccelerator)
{
//ディレクトリのアクセス許可を書き込み可能に設定します
$this-> ;fp = fopen($this->path, 'w+');
if($this->fp === false)
{
return false; }
return flock($this->fp, LOCK_EX);
}else{
return eaccelerator_lock($this->name)
}
}
/**
* ロック解除
* ここに説明を入力してください ...
*/
if(!$this->eAccelerator )
{
if($this->fp !== false)
{
flock($this->fp, LOCK_UN)
}
//閉じる
fclose($this-> ;fp);
}else{
return eaccelerator_unlock($this->name);
}
}
}
このクラスは、以前のバージョンに基づいていくつかの小さな改良が加えられています。 http://code.google.com/p/phplock を参照してください。Sun さんの共有精神に感謝します。
http://www.bkjia.com/PHPjc/322573.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/322573.html
技術記事
最近のプロジェクトでそのようなシナリオがあります 1. ファイルを生成するとき、同時実行を防ぐために複数のユーザーが生成権限を持っているため、生成された結果は間違っており、生成プロセスは...