PHP: <?php namespace core; class Cache { public static function set($file, $data, $time = '15 minutes') { $cache_path = 'tmp/caches/'; if (!is_dir($cache_path)) { mkdir($cache_path, 0777, true); } $cache_file = $cache_path . $file . '.txt'; file_put_contents($cache_file, serialize($data)); touch($cache_file, strtotime('now + ' . $time)); } public static function get($file, $key = null, $value = null) { $cache_file = "tmp/caches/{$file}.txt"; if (is_file($cache_file)) { if (time() <= filemtime($cache_file)) { // НАЧИНАЕМ - тут всё понятно: забираем содержимое файла $content = unserialize(file_get_contents($cache_file)); // Если необязательный параметр $key указан, НО его значение, например, null, то условие не выполнится if ($key) { $content = is_array($content) ? array_column($content, null, $key) : null; } // Если необязательный параметр $value указан, НО его значение, например, null, то условие не выполнится if ($value) { $content = $content[$value] ?? null; } return $content; } unlink($cache_file); } return false; } public static function unlink($file) { $cache_file = "tmp/caches/{$file}.txt"; if (is_file($cache_file)) { unlink($cache_file); } return false; } } Пример: есть кеш массива объектов Country, выполняем: PHP: <?php $country_id = filter_input(INPUT_POST, 'country_id'); $country = Cache::get('country', 'id', $country_id); if (!$country) { throw new App('Вы не ввели или неправильно ввели данные'); } Если мы не выбрали в форме чекбокс country_id, то на приёме у нас $country_id = null, следовательно в параметр Cache::get(..., ..., $country_id) улетел null, условие if ($value) {$content = $content[$value] ?? null;} не выполнилось и нам вернулось if ($key) { $content = is_array($content) ? array_column($content, null, $key) : null; }, то есть вернулся массив объектов пересортированный по id И наша проверка if (!$country) {throw new App('Вы не ввели или неправильно ввели данные');} не отработала. Как можно доработать проверки Cache::get(), может быть кто-то захочет поделиться мыслями или опытом?
не очень понятно - на кой ляд все это нужно. объект Кэш - он только и должен уметь - сохранять кеш, проверять - не протух ли и выдавать сохраненные данные.... а вы пытаетесь впихнуть внутрь валидатор, чтоб кеш еще какие то значения проверял.... не надо это логика такая 1. получили данные 2. получили кеш или получили что уже нет кеша 3. отдельно проверили какие-то свои условия (есть ли в кеше данные какие то или еще чего там) А валидатор отдельным классом пишите.... оченно пригодиться не только для кеша но и для проверки вводимых значений --- Добавлено --- непонятно какой unlink - родной или расширенный вами, если второе то вызов self::unlink()
по пунктам 1,2,3 да, сам уже за ночь переболел и выкинул нафиг, а метод self::unlink() - это просто запасной метод, вдруг админу приспичит внести изменения в закешированные данные, а кеш на год стоит, так он сам сможет его удалить для обновления данных и сам этот метод в self::get() не используется, потому что две проверки тогда будет на файл кеша, просто функцией удаляю, метод self::unlink() - просто резерв согласен, не нужна разная дичь, получаем данные из кеша, а всё остальное делаем по месту решено