💢 Проблема с переходом на 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 в продакшне.
19 июля 2016 12:01

Slach (инкогнито)
19 июля 2016, 16:42

дак советуют то использовать именно PHP7, а не memcached extension ;)
более того, большинство из тех кто советуют, достаточно прилично перерабатывали свою кодобазу под PHP7 и "отказывались от не нужных extensions" ;)

bolknote.ru (bolknote.ru)
19 июля 2016, 17:59, ответ предназначен Slach

дак советуют то использовать именно PHP7, а не memcached extension ;)
Кому нужен язык без расширений? Что на нём писать можно нормально?
достаточно прилично перерабатывали свою кодобазу под PHP7 и «отказывались от не нужных extensions» ;)
Расширение Memcched лишним не назовёшь. Его можно реализовать на PHP, конечно, но оно используется в т.ч. для скорости, а на ПХП оно будет сильно медленнее.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)