有可能以原子方式做到这一点吗?
$myvalue = apc_get("mykey");
apc_store("mykey",0);
// log/deal with myvalue
“mykey”在其他进程中频繁增加,我不想错过它们。
您正在寻找的功能是apc_cas()。“cas”代表“比较和交换”。它将在缓存中保存一个值,但前提是它自您上次获取它以来没有更改。如果函数失败,您只需重新获取缓存值并尝试再次保存。这确保不会跳过任何更改。
假设您想以原子方式递增一个计数器。该技术将是:
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()也适用于非整数值。