Кешування даних

24

Від автора: кешування даних – це операція, покликана знизити навантаження на сервер. Найчастіше кешування використовується на великих високонанавантажених проектах, але також його можна використовувати на будь-яких інших все з тією ж метою – знизити навантаження на сервер.

Для демонстрації розв’язання задачі поточного уроку, ми скористаємося вихідними кодами уроку Висновок багаторівневого меню з необмеженим рівнем вкладеності

Кешування данихКешування даних

Багаторівневе меню – це як раз той елемент, який найкраще покаже принцип і необхідність кешування. Наше багаторівневе меню використовує 2 ресурсомісткі операції – робота з БД і рекурсія. При використанні кешу ми можемо уникнути обох операцій. Замість них ми просто вважаємо файл кешу з готовим html-кодом меню, і виведемо це меню там, де нам потрібно.

Отже, для виведення багаторівневого меню ми використовуємо функцію view_cat(), яка не повертає результат, а відразу виводить його на екран. Якщо ми хочемо використовувати кешування, то нас не влаштовує подібна поведінка функції, нам потрібно, щоб функція саме повертала код меню, а не виводила його на екран. Тому давайте трохи змінимо її код, повертаючи код:

//висновок каталогу за допомогою рекурсії
function view_cat($arr,$parent_id = 0) {
if(empty($arr[$parent_id])) {
return;
}
$menu .= ‘

    ‘;
    //перебираємо в циклі масив і виводимо на екран
    for($i = 0; $i < count($arr[$parent_id]);$i++) {
    $menu .= ‘

  • .$arr[$parent_id][$i][‘title’].»;
    //рекурсія перевіряємо немає дочірніх категорій
    $menu .= view_cat($arr,$arr[$parent_id][$i][‘id’]);
    $menu .= ‘
  • ‘;
    }
    $menu .= ‘

‘;
return $menu;
}

Тепер у файлі з меню отримаємо результат роботи функції в змінну $menu і виведемо значення змінної:

// отримуємо масив каталогу
$result = get_cat();
$menu = view_cat($result);
//Виводь каталог на екран за допомогою рекурсивної функції
echo ‘

‘;
echo $menu;
echo ‘

‘;

Відмінно! Меню виводиться. Тепер додамо опцію кешування. Давайте визначимося з алгоритмом.

Зараз ми в будь-якому випадку викликаємо 2 функції – get_cat() і view_cat() – для виведення меню. Перша функція працює з БД, друга – з рекурсією. Зараз же ми повинні працювати з цими функціями за умовою – тільки в тому випадку, якщо у нас немає файлу кешу. Якщо ж файл кешу є і в ньому є вміст, тоді ми просто вважаємо це вміст, не звертаючись до двох зазначених функцій.

У файлі functions.php створимо 2 додаткові функції – функція для створення файлу кешу і для читання цього файлу.

// створення файлу кешу
function cache_file_create($data, $file){
}
// читання файлу кешу
function cache_file_read($file){
}

Функція cache_file_create() в якості параметрів приймає дані для запису в файл кеша. Функція cache_file_read() в якості параметра приймає шлях до файлу кешу.

Тепер створимо папку для файлів кеша – cache. Файл з кешем меню у нас буде називатися menu.html. Давайте визначимо в індексному файлі змінну, в якій будемо зберігати шлях до файлу кешу:

$menu_cache = «cache/menu.html»;

Ну і створимо умова, згідно з яким будемо отримувати дані з кешу або з БД:

$menu_cache = «cache/menu.html»;
if( file_exists($menu_cache) ){
$menu = cache_file_read($menu_cache);
}else{
// отримуємо масив каталогу
$result = get_cat();
$menu = view_cat($result);
cache_file_create($menu, $menu_cache);
}

Отже, тут все досить просто. Ми перевіряємо, чи існує файл кеша. Якщо він існує отримуємо результат роботи функції cache_file_read(). Інакше – отримуємо дані з БД і записуємо їх в кеш функцією cache_file_create().

Залишилося описати функції для роботи з кешем. Функція cache_file_create():

// створення файлу кешу
function cache_file_create($data, $file){
$handle = fopen($file, «w»); // відкриваємо файл на запис або створюємо, якщо його немає
flock($handle, LOCK_EX); // блокуємо файл для одноосібного користування
fwrite($handle, $data); // записуємо в нього дані
flock($handle, LOCK_UN); // розблокуємо файл
fclose($handle); // закриваємо файл
}

Функція cache_file_read():

// читання файлу кешу
function cache_file_read($file){
if( !$menu = file_get_contents($file) ){
// якщо файл порожній
$result = get_cat(); // отримуємо дані з БД
$menu = view_cat($result); // формуємо меню
cache_file_create($menu, $file); // записуємо меню у кеш
}
return $menu; // повертаємо меню
}

Ось, власне і все. Ми вирішили задачу створення простої системи кешування для сайту. Тепер у Ваших силах поліпшити її адаптувати під власні потреби. Наприклад, можна об’єднати обидві функції кешування в одну, можна врахувати старіння даних кеша для їх автоматичного періодичного оновлення і т. д.

На цьому наш урок закінчено. Удачі Вам і до нових зустрічей!