Memcached::cas
(PECL memcached >= 0.1.0)
Memcached::cas — Сравнивает и устанавливает значение для записи
Описание
Memcached::cas() осуществляет проверку и установку значения записи,
новое значение будет сохранено только если другие клиенты не обновили его
со времени последнего обращения этим клиентом. Эта проверка осуществляется с помощью
параметра cas_token
, который представляет собой 64 битное значение
присвоенное существующей записи сервером memcache. Обратитесь к документации метода
Memcached::get*(), который используется для получения этого токена.
Обратите внимание, что токен представлен в виде числа двойной точности из-за ограничений
диапазона значений целочисленного типа в PHP.
Список параметров
-
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 {
/* fetch IP list and its token */
$ips = $m->get('ip_block', null, $cas);
/* if list doesn't exist yet, create it and do
an atomic add which will fail if someone else already added it */
if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
$ips = array($_SERVER['REMOTE_ADDR']);
$m->add('ip_block', $ips);
/* otherwise, add IP to the list and store via compare-and-swap
with the token, which will fail if someone else updated the list */
} else {
$ips[] = $_SERVER['REMOTE_ADDR'];
$m->cas($cas, 'ip_block', $ips);
}
} while ($m->getResultCode() != Memcached::RES_SUCCESS);
?>
Смотрите также
- Memcached::casByKey() - Сравнивает и устанавливает значение для записи на конкретном сервере
- Функция Memcached::add() - Add an item under a new key
- Функция Memcached::addByKey() - Add an item under a new key on a specific server
- Функция Memcached::addServer() - Add a server to the server pool
- Функция Memcached::addServers() - Add multiple servers to the server pool
- Функция Memcached::append() - Append data to an existing item
- Функция Memcached::appendByKey() - Append data to an existing item on a specific server
- Функция Memcached::cas() - Compare and swap an item
- Функция Memcached::casByKey() - Compare and swap an item on a specific server
- Функция Memcached::__construct() - Create a Memcached instance
- Функция Memcached::decrement() - Decrement numeric item's value
- Функция Memcached::decrementByKey() - Decrement numeric item's value, stored on a specific server
- Функция Memcached::delete() - Delete an item
- Функция Memcached::deleteByKey() - Delete an item from a specific server
- Функция Memcached::deleteMulti() - Delete multiple items
- Функция Memcached::deleteMultiByKey() - Delete multiple items from a specific server
- Функция Memcached::fetch() - Fetch the next result
- Функция Memcached::fetchAll() - Fetch all the remaining results
- Функция Memcached::flush() - Invalidate all items in the cache
- Функция Memcached::get() - Retrieve an item
- Функция Memcached::getAllKeys() - Gets the keys stored on all the servers
- Функция Memcached::getByKey() - Retrieve an item from a specific server
- Функция Memcached::getDelayed() - Request multiple items
- Функция Memcached::getDelayedByKey() - Request multiple items from a specific server
- Функция Memcached::getMulti() - Retrieve multiple items
- Функция Memcached::getMultiByKey() - Retrieve multiple items from a specific server
- Функция Memcached::getOption() - Retrieve a Memcached option value
- Функция Memcached::getResultCode() - Return the result code of the last operation
- Функция Memcached::getResultMessage() - Return the message describing the result of the last operation
- Функция Memcached::getServerByKey() - Map a key to a server
- Функция Memcached::getServerList() - Get the list of the servers in the pool
- Функция Memcached::getStats() - Get server pool statistics
- Функция Memcached::getVersion() - Get server pool version info
- Функция Memcached::increment() - Increment numeric item's value
- Функция Memcached::incrementByKey() - Increment numeric item's value, stored on a specific server
- Функция Memcached::isPersistent() - Check if a persitent connection to memcache is being used
- Функция Memcached::isPristine() - Check if the instance was recently created
- Функция Memcached::prepend() - Prepend data to an existing item
- Функция Memcached::prependByKey() - Prepend data to an existing item on a specific server
- Функция Memcached::quit() - Close any open connections
- Функция Memcached::replace() - Replace the item under an existing key
- Функция Memcached::replaceByKey() - Replace the item under an existing key on a specific server
- Функция Memcached::resetServerList() - Clears all servers from the server list
- Функция Memcached::set() - Store an item
- Функция Memcached::setByKey() - Store an item on a specific server
- Функция Memcached::setMulti() - Store multiple items
- Функция Memcached::setMultiByKey() - Store multiple items on a specific server
- Функция Memcached::setOption() - Set a Memcached option
- Функция Memcached::setOptions() - Set Memcached options
- Функция Memcached::setSaslAuthData() - Set the credentials to use for authentication
- Функция Memcached::touch() - Set a new expiration on an item
- Функция Memcached::touchByKey() - Set a new expiration on an item on a specific server
Коментарии
Watch out!
When using binary protocol, the expected result after cas() is 21 (Memcached::RES_END).
For example, to make the above example #1 work with binary protocol, use the following:
<?php
$m = new Memcached();
$m->addServer('localhost', 11211);
$m->setOption(Memcached::OPT_BINARY_PROTOCOL,true)
// [...]
} else {
$ips[] = $_SERVER['REMOTE_ADDR'];
$m->cas($cas, 'ip_block', $ips);
}
} while ($m->getResultCode() != Memcached::RES_END);
?>
Do not check command success in a while loop with something like
$memCached->getResultCode() != Memcached::RES_SUCCESS
Memcached::RES_SERVER_ERROR or anything like this and your script will loop forev
To prevent a perpetual loop on any Memcached error, you can add a simple counter :
$security_count = 0;
do {
//[]....
$security_loop++
if ($security_loop > 10) {
break; //( or return "your return value" on a function )
}
} while ($m->getResultCode() != Memcached::RES_SUCCESS);
I'm not sure whether this remains true in the newer versions of the Memcached module (v3.0 onwards) but in the version shipped with PHP 5.6 the return value and result code when using this method with OPT_BINARY_PROTOCOL enabled are entirely useless.
Setting a value successful may return true, with a result code of RES_END, but it may also return true with a result code of RES_SUCCESS.
However, *unsuccessfully* setting a value likewise seems to return true and RES_SUCCESS, effectively rendering this function's return value useless with the binary protocol enabled as it is impossible to distinguish success from failure.
If you need to rely on the return value of this method then I strongly recommend disabling the binary protocol under PHP 5.6, as in its current state the common memcached module is too broken otherwise for CAS usage.
Hopefully someone else can weigh in on whether this is still broken in newer versions or not.