Кэширование контента в файлы PHP

Для ускорения работы PHP-сайта можно применить механизм единоразового сохранения сформированного контента в файлах кэша для их повторного использования, например меню сайта, «тяжелый» вывод выгрузки из базы данных и т.д.

Для этих целей был написан небольшой статический PHP-класс для кэширования блоков контента или страниц целиком основанный на буферизации вывода в переменную.

Код файла cache.php

  1. <?php
  2. class Cache
  3. {
  4. public static $enable = true;
  5. public static $path = '/cache';
  6. private static $keys = array();
  7.  
  8. /**
  9. * Получение данных из кэша.
  10. */
  11. public static function get($name)
  12. {
  13. if (self::$enable) {
  14. $file = __DIR__ . self::$path . '/' . $name . '.tmp';
  15. if (file_exists($file)) {
  16. return file_get_contents($file);
  17. } else {
  18. self::$keys[] = $name;
  19. return false;
  20. }
  21. } else {
  22. return '';
  23. }
  24. }
  25.  
  26. /**
  27. * Отправка данных в кэш.
  28. */
  29. public static function set($content)
  30. {
  31. if (self::$enable) {
  32. $name = array_pop(self::$keys);
  33. $dir = __DIR__ . self::$path . '/';
  34. if (!is_dir($dir)) {
  35. @mkdir($dir, 0777, true);
  36. }
  37. file_put_contents($dir . '/' . $name . '.tmp', $content);
  38. }
  39.  
  40. return $content;
  41. }
  42.  
  43. /**
  44. * Начало кэширования фрагмента.
  45. */
  46. public static function begin($name)
  47. {
  48. if ($content = self::get($name)) {
  49. echo $content;
  50. return false;
  51. } else {
  52. return true;
  53. }
  54. }
  55.  
  56. /**
  57. * Завершение кэширования фрагмента.
  58. */
  59. public static function end()
  60. {
  61. echo self::set(ob_get_clean());
  62. }
  63.  
  64. /**
  65. * Очистка кэша.
  66. */
  67. public static function clear()
  68. {
  69. $dir = __DIR__ . self::$path;
  70. foreach (glob($dir . '/*') as $file) {
  71. if (is_file($file)) {
  72. unlink($file);
  73. }
  74. }
  75. }
  76. }

Использование
  1. // Подключаем файл класса
  2. require_once '/cache.php';
  3.  
  4. // Кэшируем фрагмент кода
  5. if (Cache::begin('test')) {
  6. ?>
  7.  
  8. <!-- ------------------------ -->
  9. <!-- "Тяжелый" вывод контента -->
  10. <!-- ------------------------ -->
  11.  
  12. <?php
  13. Cache::end();
  14. }

Теперь, если в папке cache нет файла test.tmp, то условие выполнится, контент выведется и сохранится в файле. В другом случаи контент всегда будет выводится из файла кэша.
  1. <!-- ------------------------ -->
  2. <!-- "Тяжелый" вывод контента -->
  3. <!-- ------------------------ -->


  17.01.24 / 19:27 | PHP |   56 | 0   0