aaadddminnn
@aaadddminnn
php it ubuntu debian

Правильно ли я сделалл кеш?

Привет. За часик сделал кеш на файлах. Хочу узнать по поводу качества моего велосипедика :D
Зарание спасибо. Вот сам код
P.S отредактировал по вашим советам
class Cache {

  function fileTo($file, $time) {
    $filename = 'storage/cache/' . $file;
    if (file_exists($filename)) {
      if ((time() - $time) < filemtime($filename)) {
        return true;
      } else {
        return false;
      }
    } else {
      return false;
    }
  }

  function fileEcho($file) {
    $file = 'storage/cache/' . $file;
    return file_get_contents($file);
  }

  function fileNewCache($file, $data) {
    $file = 'storage/cache/' . $file;
    $fp = fopen($file, "w");
    flock ($fp,LOCK_EX);
    fwrite($fp, $data);
    flock ($fp,LOCK_UN);
    fclose($fp);
  }

  function fleDelete($file) {
    $file = 'storage/cache/' . $file;
    unlink($file);
  }

}
  • Вопрос задан
  • 262 просмотра
Решения вопроса 4
Pjeroo
@Pjeroo
Веб-разработчик
Это не кэш, это просто чтение-запись текстовых данных. Где хотя бы простая сериализация? Мой Вам совет - почитайте исходники фреймворков, там реализован всякий разный кэш (файловый, редисковый ит.д), хотя бы Yii. Посмотрите как там сделано, переделайте свой велосипед, сделайте так, чтобы он работал и выглядел правильно, а потом никогда не используйте его в реальных проектах.
Ответ написан
Комментировать
index0h
@index0h
PHP, Golang. https://github.com/index0h
У вашего велосипеда есть узкие места:
1. Вы в принципе не думали про то, что несколько потоков могут затребовать файл, и в этот момент один из них его может удалить, или обновлять.
2. Каталог storage должен быть доступен для записи, в случае чего - нужно бросать исключение на этот счет.
3. Вот эта функция не должна существовать))
function fileEchoCache($file) {
    $file = 'storage/cache/' . $file;
    echo file_get_contents($file);
  }

Она не входит в обязанности менеджера кэша.
4. В имя файла может входить что угодно например: "some \\ // \n \tcool file\r\b\b\a HeRe"
5. Посмотрите https://github.com/php-fig/fig-standards/blob/mast...
6. Если у вас будет реально много файлов - это станет источником нагрузки на файловую систему. Вложенные каталоги решают эту проблему.
Ответ написан
Denormalization
@Denormalization
А где обработка ошибок?
Названия функций ну вот вообще ни о чем не говорят.
А если я сделаю вот так:
$cache->fileEchoCache('../../../../config.php');
Что будет?

unlink($file); без проверки пути...

А если я захочу использовать кеш в памяти, заместо файлового? Мне по всему проекту бегать искать и заменять вызовы?
Лучше удали это.
Ответ написан
@dmitryKovalskiy
программист средней руки
Ну технически кэш - это данные которые хранятся в памяти. Поправьте если я ошибаюсь. Ваше решение завязано на имя файла(а они могут и повторяться для разных файлов(всякие image0001.jpg) . Также операции чтения/записи на диск - не бесплатны.А порой и дорогие для больших файлов. Ну и потокобезопасность может страдать от такого кода. Хотя я почти не знаком с php. Возможно это и решение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы