Баги в библиотеке 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
Для отправки комментария вам необходимо авторизоваться.