bolk (bolk) wrote,
bolk
bolk

💢 Проблема с переходом на 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 в продакшне.

Subscribe

  • Ортопедические стельки

    В своих поисках того как можно облегчить состояние травмированной когда-то на спортивной гимнастике спине, забрёл к ортопеду. Я подозревал, что…

  • Монета Михаила Фёдоровича

    Давно хотел в свою коллекцию какую-нибудь допетровскую монету и вот, — заполучил, наконец, копейку Михаила Фёдоровича, первого русского царя из…

  • Темп речи

    Сейчас многие компании переходят на удалённый или гибридный режим работы. Наша компания не исключение. Хотя я до сих пор искренне считаю, что…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments