2012-01-05 5 views
2

私はmutexを作成する必要があるWindows XP SP3とApache 2.2.21を実行するWebサーバーでPHP 5.3.8を使用しています。mutex with PHP 5.3.8

class Mutex 
{ 
    private $lock_ = null; 

    // create a mutex with with a given id. This ID must be system unique. 
    // [string] id - a unique id 
    // return - true on success 
    public function Initialize($id) 
    { 
     $this->lock_ = fopen($id, 'a'); 
     return is_resource($this->lock_); 
    } 

    // destroy the mutex 
    public function Destroy() 
    { 
     $result = false; 
     if (is_resource($this->lock_)); 
     { 
      $result = flock($this->lock_, LOCK_UN); 
      $result &= fclose($this->lock_); 
      $this->lock_ = null; 
     } 
     return $result; 
    } 

    // exclusively lock the resource 
    // return - true on success 
    public function Lock() 
    { 
     if (is_resource($this->lock_)) 
      return flock($this->lock_, LOCK_EX); 
     return false; 
    } 

    // release the locked resource 
    // return - true on success 
    public function Release() 
    { 
     if (is_resource($this->lock_)) 
      return flock($this->lock_, LOCK_UN); 
     return false; 
    } 
} 

しかし、私はこのクラスを使用するために行く:私はAcquired 1 Acquired 2を参照してください

$this->cache_lock_ = new Mutex(); 
$this->cache_lock_->Initialize("e:\\cache_lock"); 

if ($this->cache_lock_->Lock()) 
    echo "Acquired 1 ".PHP_EOL; 
if ($this->cache_lock_->Lock()) 
    echo "Acquired 2 ".PHP_EOL; 
$this->cache_lock_->Release(); 

$this->cache_lock_->Destroy(); 

はロックがしたことを示す印刷されたいくつかの研究の後、私はflockコマンド渡って来ていると、このようにそれを実装します私はそれが排他的であると指定しているにもかかわらず、

誰かが私が間違っていることを示唆できますか?理想的には、リソースが利用可能になるまで、2番目のLock()呼び出しをブロックしたいと思います。

おかげで、 PaulH

+0

あなたの 'Destroy'には' if(is_resource($ this-> lock _)); 'があります。セミコロンはないはずです。また、PHP5を使用している場合は、 'Initialize'と' Destroy'の代わりに '__construct'と' __destruct' PHPマジックメソッドを使うことを検討してください。 –

答えて

4

機能のチェックはファイルハンドルがすでにロックされている場合、それがあれば、それは返すので、両方の時間をtrueを返します同じファイルハンドルの二回群れを()を呼び出すと、ブロックされません本当。これは予想される動作です。しかし、複数のプロセスが並行して実行される場合は、すべてのプロセスが異なるファイルハンドルを持つため、期待通りに動作します。これを単一のプロセスでテストしたい場合は、同じファイルオブジェクトに対して複数のハンドルを作成してください:

$a = new Mutex(); 
$a->Initialize("file.lock"); 
$a->Lock(); // this will simply lock the file object 
$b = new Mutex(); 
$b->Initialize("file.lock"); 
$b->Lock(); // this will block, because the file is locked by $a 
+0

まさに私が望むふるまいです。どうもありがとうございました。 – PaulH