(PECL memcached >= 0.1.0)
Memcached::cas — アイテムを比較して入れ替える
Memcached::cas() は「チェックして設定」という操作を行います。
アイテムが格納されるのは、クライアントが最後にアイテムを取得して以降に
他のクライアントによるそのアイテムの更新がなかった場合のみです。
チェックは cas_token
パラメータを使用して行います。
これは一意な 64 ビットの値で、既存のアイテムに対して memcache が割り当てます。
このトークンを取得する方法については
Memcached::get*() メソッドのドキュメントを参照ください。
PHP の integer 型の範囲を超えるため、トークンは double 型であらわされることに注意しましょう。
cas_token
既存のアイテムに割り当てたれた一意な値。memcache が生成します。
key
値の格納先のキー。
value
格納する値。
expiration
期限切れとなるまでの時間。デフォルトは 0。詳細な情報は有効期限 を参照ください。
成功した場合に true
を、失敗した場合に false
を返します。
格納しようとしているアイテムが最後の取得以降に更新されている場合、
Memcached::getResultCode() は
Memcached::RES_DATA_EXISTS
を返します。
例1 Memcached::cas() の例
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
do {
/* IP リストとそのトークンを取得します */
$ips = $m->get('ip_block', null, $cas);
/* リストが存在しない場合はまず作成してからアトミック名追加を行います。
誰かがすでに追加している場合は失敗します */
if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
$ips = array($_SERVER['REMOTE_ADDR']);
$m->add('ip_block', $ips);
/* それ以外の場合は、IP をリストに追加して、トークンによる「比較して入れ替え」
方式で格納します。だれかがリストを更新している場合は失敗します */
} else {
$ips[] = $_SERVER['REMOTE_ADDR'];
$m->cas($cas, 'ip_block', $ips);
}
} while ($m->getResultCode() != Memcached::RES_SUCCESS);
?>