基本上,我们有两个计数器,一个是添加项目的计数器,另一个是要求保护项目的计数器。尽管它是使用apcu扩展名用PHP编写的,但是inc / add / exists / store / delete关键字应该使任何人都可以理解。 (存储总是设置,仅在键不存在时才添加,inc返回递增的值,如果键不存在则返回FALSE)
function createItem($item) {
if (!$current = apcu_inc('queue', 1)) {
// These should never fail.
if (!apcu_add('queue', 0) || !apcu_add('queue_claim', 0)) {
return FALSE;
}
$current = 0;
}
return apcu_add('queue' . $current, $item);
}
function claimItem($item) {
if (!apcu_exists('queue_claim')) {
return;
}
for ($i = apcu_get('queue_claim'); $i <= apcu_get('queue'); $i++) {
if (apcu_exists('queue' . $i) && apcu_add('process' . $i, '')) {
// Every item below either doesn't exist or is being processed.
apcu_store('queue_claim', $i + 1);
$item = apcu_get('queue' . $i);
apcu_delete('queue' . $i);
apcu_delete('process' . $i);
return $item;
}
}
}