1

アトミックな方法でこれを行うことは可能ですか?

$myvalue = apc_get("mykey");
apc_store("mykey",0);
// log/deal with myvalue 

"mykey" は他のプロセスで頻繁に増加しており、それらのカウントを逃したくありません。

4

1 に答える 1

3

探している関数はapc_cas()です。「cas」は「compare and swap」の略です。キャッシュに値を保存しますが、最後にフェッチしてから変更されていない場合に限ります。関数が失敗した場合は、キャッシュされた値を再度フェッチして、再度保存を試みます。これにより、変更がスキップされなくなります。

カウンターをアトミックにインクリメントしたいとしましょう。テクニックは次のようになります。

apc_add('counter', 0); // set counter to zero, only if it does not already exist.    
$oldVar = apc_fetch('counter'); // get current counter

// do whatever you need to do with the counter ...

// ... when you are ready to increment it you can do this
while ( apc_cas('counter', $oldVar, intval($oldVar)+1) === false ) {
    // huh.  Someone else must have updated the counter while we were busy.
    // Fetch the current value, then try to increment it again.
    $oldVar = apc_fetch('counter');
}

APC がこれに特化したインクリメンタとデクリメンタapc_inc()apc_dec( ) を提供するのはたまたまです。

Memcache には、整数以外の値でも機能するcas()があります。

于 2013-04-27T20:37:58.803 に答える