Баги в библиотеке memcached (getMulti)

Долго боролись с багом при использовании Memcached::getMulti в php 5.3.8.

Как это было:
Сначала данные складываются в кэш под некоторыми ключами, потом происходит считывание

	$cached = cache->getMulti( $cacheKeys );

	foreach ( $actions as &$action )
	{
		$actionCacheKey = self::getCacheKey( $action );

		if ( array_key_exists( $actionCacheKey, $cached ) ) {
			$action = $cached[$actionCacheKey];
		}
		else if ( in_array( $actionCacheKey, array_keys( $cached ) ) ) {
			die( '!!' );
		}
		else {
			$action = self::factory( $action );
		}
	}

Так вот, if ( array_key_exists( $actionCacheKey, $cached ) ) не отрабатывает никогда (равно как isset и ! empty).
При этом условие else if ( in_array( $actionCacheKey, array_keys( $cached ) ) ) всегда истинно.

При этом опытным путём было выяснено, что некоторые префиксы ключей «работают как надо», но есть зависимость работы как надо от сервера.
В общем долго промучались.
В итоге, как и подозревали, проблема оказалась в библиотеке Memcached (при использовании бинарного протокола setOption( Memcached::OPT_BINARY_PROTOCOL, true );) и даже заведена бага:
https://bugs.php.net/bug.php?id=59990

LEAVE A COMMENT