Коцюбинський В.Ю., Олексюк А.Ю., Цікал І.В.

Вінницький національний технічний університет

Використання тегів в Memcached при роботі з Zend Framework

 

При роботі будь якої web-системи однією з її найголовніших характеристик є швидкість роботи. Тобто зменшення часу загрузки ресурсу стає пріоритетною задачею. Досить ефективним є кешування запитів до бази або до файлової системи. Існує велика кількість систем кешування, які з кожним днем покращують свої характеристики. Але найбільш гострою проблемою при використанні кешування є отримання користувачем актуальних даних. Важливо розробити систему, щоб користувач отримував інформацію з кешу тільки до тих пір доки вона не буде змінена.  Досить перспективним і актуальним є використання в веб-технологіях сервісу memcached, що дозволяє кешувати дані в оперативній пам’яті на основі парадигми розподіленої хеш-таблиці. Розподіл даних реалізується по значенню хеш ключа. Клієнтська бібліотека, використовуючи ключ даних, визначає його хеш і використовує його для вибору відповідного сервера. Ситуація збою сервера трактується як промах кеша. Це дозволяє, зокрема, проводити гарячу заміну серверів.

В API memcached є тільки базові функції: вибір сервера, установка з'єднання, додавання, видалення, оновлення і отримання об'єкта. Для кожного об'єкта встановлюється час актуальності кешу, починаючи з 1 секунди до нескінченності. При переповненні пам'яті більш старі об'єкти кеша автоматично знищуються. На даний час великі веб-системи розробляються з використанням фрейморків. Це є доцільним, оскільки дозволяє включати в код уже протестовані і оптимізовані частини і досить гнучко налаштовувати власну систему. Тому задача розглядалась з використанням відкритого об’єктно орієнтованого PHP фреймворка для розробки веб-додатків і веб-сервісів - Zend Framework. Він оснований на ідеях MVC, та розробляється компанією Zend, яка являється розробником самого PHP.

Застосовувати Memcached для покращення швидкості програми можна досить ефективно і без використання ZF, але використовуючи фреймворк в роботі з Memcached можна отримати досить гнучку і стабільну в роботі систему. Крім того, якщо вся система побудована з використанням ZF, то  є логічним його використання і при роботі з кешем.

На даний момент  робота з Memcached  кешем в ZF не підтримує використання тегів. Що є очевидним недоліком, оскільки з часом стає досить складно слідкувати за актуальністю даних,  особливо в великих системах.

Метою дослідження є пошук оптимального з існуючих способів використання тегів в memcached  і покращення його.

Потрібно також відмітити що memcached community намагалось додати підтримку тегів для memcached, але на даний момент існує тільки нестабільна версія, використання якої може призвести до зависання самого сервера.

Вирішенням цієї проблеми, а отже і покращенням використання кешу, може бути розробка класа обробника стандартних команд присутніх в ZF. Ідея полягає у зберіганні тегів як окремого об’єкта кешу у вигляді асоціативного масиву. Ключами в такому масиві виступатимуть теги, а значеннями імена об’єктів кешу. Структура масиву тегів (TagArray) зображена на рисунку 1.

 Клас має включати в себе наступні методи:

-         створення об’єкту і позначення його тегом;

-         видалення тегу і всіх об’єктів які помічені ним;

-         отримання всіх об’єктів за вказаним тегом.

Також система має включати в себе основні методи, які уже існують в ZF для роботи з memcached. При видалені об’єкта із пам’яті по часу існування може виникнути ситуація, що в масиві тегів буде залишатись запис про об’єкт хоча насправді він уже не існує. Тому обов’язковим параметром при створенні об’єкту кешу є встановлення часу "життя" об’єкту. Через вказаний проміжок часу буде запущений метод для видалення об’єкту із кешу, а якщо це був єдиний запис який відповідав цьому ключу, то і сам тег буде видалений.

 

Рисунок 1 – Масив тегів. Структура

 

Авторами був розроблений клас ZF_Cache_Tag, який включає три основних методи:

-         setData() – аналог стандартного методу save() з підтримкою можливості додавання тегів;

-         removeTagFromTAGARRAY() – метод для своєчасного видалення запису з масиву тегів при закінчені часу існування об’єкту в кеші;

-         getTagRow() – матод для отримання об’єктів які відмічені певним тегом.

Розглянемо метод setData(). Він приймає чотири параметри: ім’я масиву що зберігається, сам масив, масив тегів якими він помічений і час через який має бути видалений об’єкт. Якщо час не встановлений він буде взятий із конфігураційних файлів ZendFramwor.  Для кожного елемента із масиву тегів, що був переданий в метод здійснюється перевірка чи існує такий тег в асоціативному масиві тегів збережених в кеші.

 

Рисунок 2 – Структура метода setData()

 

В випадку існування – до значень які відповідають іменам об’єктів даного тегу додається новий, якщо існує відповідне ім’я об’єкта повертається відповідне повідомлення. В випадку коли тег не знайдений – він створюється і додається перший елемент, який є іменем об’єкта. Також запускається метод, який має видалити тег зі всіма записами, які йому відповідають через кількість секунд, які вказані як час збереження об’єкту в кеші. Таким чином ми уникаємо ситуації існування запису про об’єкт в масиві тегів при відсутності об’єкта в кеші.  Структура метода setData() зображена на рисунку 2.

Метод  getTagRow() дає можливість швидко отримувати інформацію про об’єкти відзначені одним і тим же тегом. Це дозволяє контролювати і швидко змінювати пов’язану між собою інформацію не роблячи додаткових запитів до бази даних і тим самим зменшуючи навантаження на неї. В результаті роботи методу буде отриманий масив імен об’єктів або повідомлення про відсутність такого тегу в кеші.

 

    function getTagRow($tag){

                $TAGARRAY = $this->cache->load("TAGARRAY");

                if(@array_key_exists($tag, $TAGARRAY)){

                            return $TAGARRAY[$tag];

                }else{

                            return "Tag ".$tag." not found in TAGARRAY";

                }

    }

 

Лістинг 1. Отримання об’єктів відмічених заданим тегом

 

Авторами розроблено методику додавання тегів при збереженні об’єктів в кеші при роботі з memcached з використанням Zend Framwork. При цьому було підвищено ефективність використання кешування за рахунок більш точного відслідковування актуальності закешованих об’єктів. Даний клас обробник може бути використаний в високонавантажених системах, які потребують своєчасного оновлення даних при можливості кешування великих об’ємів інформації. З цього приводу плануються подальші дослідження.

Експериментальна перевірка показала, що методика дозволила зменшити кількість операцій по перевірці актуальності даних в 2.5 рази і зменшити кількість запитів до бази даних в 3 рази.

 

Література:

1.  Trachtenberg A.,  Sklar  D. PHP Cookbook: Solutions and Examples for PHP Programmers – Sebastopol: O’Reilly Media, 2006 – 786 p.

2.  Lerdorf R., Tatroe  K., MacIntyre  P. Programming PHP – Sebastopol: O’Reilly Media, 2006 – 524 p.

3.   Pope K. Zend Framework 1.8 Web Application Development Birmingham: Packt Publishing Ltd., 2009350 p.

4.  Allen R., Lo N., Brown S. Zend Framework in Action Greenwick: Manning  Publications Co., 2009425 p.

5.  Curioso A., Bradford R., Galbraith P. Expert PHP and MySQL (Wrox Programmer to Programmer) – Indianapolis: Wiley Publishing, 2010 – 624 p.