💢 Проблема с переходом на PHP7: Memcached, часть вторая
В прошлый раз я писал о проблемном Мемкешд в ПХП7 и оказалось, что я не совсем прав. Проблема есть, но её корень я понимал неверно.
Я-то думал, что получение токена cas просто сломали при переезде на следующую версию ПХП, а оказалось это особенность — в ПХП7 используется третья версия модуля, а ней токен получается иначе — надо передать специальный параметр и после вызова токен будет в результирующем массиве.
Черновым кодом это выглядит примерно так (должно работать, но я его не запускал):
if (version_compare(phpversion('memcached'), '3.0.0-dev', '<')) {
// работаем по-старому
return $memcached;
} else {
// возвращаем обёртку
return new class($memcached) {
use \Core\ProxyTrait;
public function __construct($mc)
{
$this->setObject($mc);
}
public function get($key, callable $cache_cb = null, &$cas_token = null)
{
$result = $this->obj->get($key, $cache_cb, Memcached::GET_EXTENDED);
if ($result === Memcached::GET_ERROR_RETURN_VALUE) {
return false;
}
if ($result) {
$cas_token = $result['cas'];
return $result['value'];
}
return $result;
}
public function getMulti(array $keys, array &$cas_tokens = null, int $flag = null)
{
$result = $this->obj->getMulti($keys, Memcached::GET_EXTENDED | $flag);
if ($result === Memcached::GET_ERROR_RETURN_VALUE) {
return false;
}
if ($result) {
$values = [];
$cas_tokens = [];
foreach ($result as $key => $d) {
$values[$key] = $d['value'];
$cas_tokens[$key] = $d['cas'];
}
return $values;
}
return $result;
}
}
}
Вся мякотка в последнем параметре Memcached::GET_EXTENDED, он заставляет возвращать соответствующие методы не искомое значение, а массив, содержащий в том числе и cas.
Неприятно, что в этой версии ПХП модуль для работы с Мемкешд помечен как «разработческий». В этом свете мне как-то неясна позиция тех, кто уверенно советует использовать ПХП7 в продакшне.
дак советуют то использовать именно PHP7, а не memcached extension ;)
более того, большинство из тех кто советуют, достаточно прилично перерабатывали свою кодобазу под PHP7 и «отказывались от не нужных extensions» ;)
Комментарий для Slach:
Кому нужен язык без расширений? Что на нём писать можно нормально?
Расширение Memcched лишним не назовёшь. Его можно реализовать на PHP, конечно, но оно используется в т.ч. для скорости, а на ПХП оно будет сильно медленнее.