Статьи  : 

Проверка кешированных данных

19 января 2017, 08:30

Для снижения нагрузок на сайт применяется методика кеширования подготовленных данных. В этом случае скрипт не выполняет запросы в базу и не проводит обработку данных, а сразу берет готовые результаты из кеша. В качестве кеша может выступать, например, файловое хранилище.

Обратим внимание на следующую распространенную ошибку при обработке возвращаемого результата из кеша. Для этого рассмотрим типовой механизм работы:

// проверяем, есть ли данные в кеше
$data = $this->cache->get('data_key');

if (!$data)
{
	// данных в кеше нет - сделаем запрос в базу и запишем в кеш
	$result = $this->db->query("SELECT ....");
	$this->cache->set('data_key', $result);
}


Как видно, из-за слабой типизации php повторный запрос данных из базы будет происходить не только когда данных в кеше действительно нет (возвращается false), но и, в частности, на пустую строку или на пустой массив (например, в запрошенной выборке нет товаров).

Для проверки запустим следующий код:

$this->cache->set('test.key', '');

$cache = $this->cache->get('test.key');

if (!$cache)
{
	echo 'not found';
}
else
{
	var_dump($cache);
}

echo '<br />';

if (false === $cache)
{
	echo 'not found';
}
else
{
	var_dump($cache);
}

echo '<br />';

$this->cache->set('test.key', array());

$cache = $this->cache->get('test.key');

if (!$cache)
{
	echo 'not found';
}
else
{
	var_dump($cache);
}

echo '<br />';

if (false === $cache)
{
	echo 'not found';
}
else
{
	var_dump($cache);
}


Его результаты, как и ожидалось:

not found (ошибка)
string(0) "" (корректно)
not found (ошибка)
array(0) { } (корректно)


Как видно, для правильной проверки существования кешированных данных нужно использовать строгую проверку false === $cache. Если не учесть данный момент, то получится так, что кеш вроде бы и есть, но используется он неэффективно.