Поскольку все ваши параметры поиска являются флагами, которые могут быть 0 или 1, вы можете рассмотреть битовую маску.
Каждый из ваших фильтров будет представлять значение, равное 2:
$filter_1 = 1;
$filter_2 = 2;
$filter_3 = 4;
...
$filter_8 = 256;
...
$filter_16 = 65536;
Используя PHP побитовые операторы , вы можете легко сохранить все 16 значений фильтра в одном целом числе. Например, значение «257» может быть достигнуто только с помощью комбинации filter_1 и filter_8. Если пользователь выбрал filter_1 и filter_8, вы можете определить битовую маску, выполнив:
$bitmask = $filter_1 | $filter_8 //gives 257
Благодаря уникальной битовой маске, отображающей состояние всех ваших фильтров, вы можете просто использовать ее в качестве ключа кеша без дорогостоящих операций md5. Поэтому в этом случае вы должны сохранить файл с именем «257» в своем кэше.
Этот метод также дает вам простой инструмент для аннулирования вашего кэша, так как вы можете проверять новые и обновленные записи, чтобы определить, каким фильтрам они соответствуют, и удалять любой файл, в имени которого установлен этот "бит", т.е. if ( ((int)$filename) & $filter == $filter) unlink($filename);
. Если в ваших таблицах происходит частая запись, это может привести к некоторым проблемам с производительностью при сканировании кэша, но это неплохой метод для приложений с большим объемом чтения.
Это подход, который я люблю использовать при работе с битами или флагами. Однако вы должны тщательно обдумать, действительно ли вам нужно такое кэширование. Если у вас всего несколько пользователей системы, действительно ли у вас будут проблемы с производительностью на основе нескольких поисковых запросов? Кроме того, MySQL имеет встроенное кэширование запросов, которое очень хорошо работает в приложениях с высоким уровнем чтения. Если ваши процедуры генерации страниц результатов дороги, то кэширование выходных фрагментов определенно может быть полезным, но если вы говорите только о микросекундах производительности для нескольких пользователей, это может не стоить этого.