Memcached в PHP - просто з Zend Framework
Мітки: zend framework, кешування, memcache
Memcached в PHP - просто с Zend Framework
Memcached in PHP Made Easy With Zend Framework
| ← 80+ запитань на співбесіді на посаду SEO-спеціаліста | Робота з форматами стиснення RAR, LZF і Bz2 в PHP → |
Застосувати Memcached для покращення швидкодії ваших програм можна досить швидко і без використання Zend Framework. Якщо вам потрібен лише Memcached, пропустіть частину про Zend Framework (і, очевидно, всю статтю). З іншого боку, якщо ви використовуєте Zend Framework, але не використовуєте Memcached, ця стаття допоможе вам розпочати це робити. Але, в будь-якому разі: якщо ви досі не використовуєте Memcached, починайте вже завтра.
Що таке Memcached
Ось визначення безпосередньо з сайту Memcached: «Memcached - це швидкодіюча система об'єктного кешування розподіленої пам'яті». Іншими словами, Memcached допомагає вам збільшити швидкодію програми за рахунок кешування даних в пам'яті. Використання Memcached для завантаження даних замість бази даних або файлової системи може суттєво вплинути на швидкодію вашої програми. Найкраще те, що користь зростає з підвищенням навантаження, а отже, ви покращуєте масштабованість.
Короткий огляд Zend_Cache
До того, як ми продовжимо розглядати Memcached в ZF, важливо розуміти, яким чином кешування представлено в Zend_Cache. У Zend_Cache вам потрібно налаштовувати «стратегію» frontend (Zend_Cache_Frontend) і «двигун» backend (Zend_Cache_Backend). Кожний кешуючий об'єкт повинен мати backend і frontend.
Двигун backend - це якраз те, про що ви думаєте: метод, який використовується Zend_Cache для зберігання кешованих даних. На даний момент Zend Framework використовує такі backend'и: File, SqlLite, XCache, Memcached, Apc і Zend Platform. Є ще один backend, що називається «TwoLevels», який може зберігати дані в швидкому або повільному backend'і, в залежності від пріоритету. (Я, взагалі-то, не дуже обізнаний, як це працює і навіщо вам це потрібно).
Стратегія frontend піклується про дві речі: перевірка закінчення терміну дії і способу реалізації кешування. Наприклад, ви можете застосовувати Zend_Cache_Frontend_File до даних кешу до тих пір, поки певний файл не буде змінено. Приклад з життя - кешування сутності Zend_Config_Xml до тих пір, доки XML-файл, на який він вказує, не буде змінено. Найпростіша frontend-стратегія це Zend_Cache_Core, яка просто каже: «Скажи мені що кешувати і коли повинен закінчитися термін дії цього». Zend_Cache_Core це те, що ми будемо використовувати в нашому прикладі.
Реалізація з Zend Framework
Перше, що потрібно зробити - це встановити наш об'єкт кешування. Як ви здогадалися, Zend Framework реалізує Memcached через Zend_Cache_Backend_Memcached. Я вирішив, що Zend_Cache_Core найбільш зручний для першого запуску в моїх програмах, я раджу вам почати саме з нього.
Прибрати підсвітку коду
Тут ми створили нову сутність Zend_Cache_Core (frontend) і Zend_Cache_Backend_Memcached, які використовують Zend_Log для логування.
Налаштування Zend_Cache_Backend_Memcached:
servers
Список серверів, розділених комами, які повинна використовувати ця сутність.
compression
Визначає, чи мають дані бути стислі до того, як вони будуть записані.
Налаштування Zend_Cache_Core:
caching
включення кешування. Це зручно, якщо ви хочете залишити перемикач включено / вимкнено для виключення кешування з процесу. У моїх програмах, я передаю тут змінні Zend_Config.
cache_id_prefix
Це значення, яке буде підставлятися перед id (індексом) кожного кешованого об'єкту.
logging
Це включає логування для даного backend. Ви повинні вказати logger в опції `logger`, яка описана нижче.
logger
Це повинна бути сутність Zend_Log, який ви хочете використовувати для логування.
write_control
це виконує постійну перевірку, коли які-небудь дані пишуться в кеш. Це безпечніше, але повільніше.
automatic_serialization
Включення цієї опції дозволить вам прозоро проводити дані, які не є рядками або числами. Наприклад, ви можете провести сутність Zend_Xml_Config без попередньої серіалізаціі, з розрахунком на те, що ви зможете прочитати її з кешу.
ignore_user_abort
Якщо ця опція встановлена, ignore_user_abort буде встановлюватися як true під час того, як буде записуватися кеш. Це допомагає запобігти спотворенню даних.
Коли все налаштовано й позначено, ми об'єднуємо його з Zend_Cache:: factory(), що дає нам повністю налаштоване кешування об'єктів. Тепер ми можемо використовувати кешування об'єктів в нашому коді:
Прибрати підсвітку коду
Логіка доволі проста. По-перше, ми перевіряємо чи виконується memcache сервер, щоб визначити, чи існують дані і чи використовуються вони. Якщо ні, ми завантажуємо дані як звичайно, без кешування. Якщо вони доступні, ми просто завантажуємо їх з memcache і робимо, що нам потрібно.
Відзначте, що якщо ви не встановлюєте automatic_serialization, як ми зробили вище, ви можете використовувати набагато простішу конструкцію. Коли ви зберігаєте рядки, і Zend_Cache не робить вам ніяких змін, дані не перевіряються на цілісність (наскільки я розумію, вони можуть бути правильно перетворені з послідовної форми в паралельну).
Прибрати підсвітку коду
Зверніть увагу, що ви зберігаєте декілька рядків і все, що вам потрібно, це обернути існуючий код в єдиний блок if. Тільки запам'ятайте - якщо це не рядок або число, вам потрібно буде виконати serialize / deserialize самостійно.
Висновок
Реалізація Memcached в Zend Framework надиво проста. Якщо у вас є відповідні ресурси і достатньо прав для встановлення Memcached, я не уявляю собі причину, за яку ви не захочете цього зробити. Завдяки кільком додатковим рядкам коду ваш додаток може миттєво стати більш продуктивним і легким в масштабуванні.
Оригінал: Memcached in PHP Made Easy With Zend Framework
Що таке Memcached
Ось визначення безпосередньо з сайту Memcached: «Memcached - це швидкодіюча система об'єктного кешування розподіленої пам'яті». Іншими словами, Memcached допомагає вам збільшити швидкодію програми за рахунок кешування даних в пам'яті. Використання Memcached для завантаження даних замість бази даних або файлової системи може суттєво вплинути на швидкодію вашої програми. Найкраще те, що користь зростає з підвищенням навантаження, а отже, ви покращуєте масштабованість.
Короткий огляд Zend_Cache
До того, як ми продовжимо розглядати Memcached в ZF, важливо розуміти, яким чином кешування представлено в Zend_Cache. У Zend_Cache вам потрібно налаштовувати «стратегію» frontend (Zend_Cache_Frontend) і «двигун» backend (Zend_Cache_Backend). Кожний кешуючий об'єкт повинен мати backend і frontend.
Двигун backend - це якраз те, про що ви думаєте: метод, який використовується Zend_Cache для зберігання кешованих даних. На даний момент Zend Framework використовує такі backend'и: File, SqlLite, XCache, Memcached, Apc і Zend Platform. Є ще один backend, що називається «TwoLevels», який може зберігати дані в швидкому або повільному backend'і, в залежності від пріоритету. (Я, взагалі-то, не дуже обізнаний, як це працює і навіщо вам це потрібно).
Стратегія frontend піклується про дві речі: перевірка закінчення терміну дії і способу реалізації кешування. Наприклад, ви можете застосовувати Zend_Cache_Frontend_File до даних кешу до тих пір, поки певний файл не буде змінено. Приклад з життя - кешування сутності Zend_Config_Xml до тих пір, доки XML-файл, на який він вказує, не буде змінено. Найпростіша frontend-стратегія це Zend_Cache_Core, яка просто каже: «Скажи мені що кешувати і коли повинен закінчитися термін дії цього». Zend_Cache_Core це те, що ми будемо використовувати в нашому прикладі.
Реалізація з Zend Framework
Перше, що потрібно зробити - це встановити наш об'єкт кешування. Як ви здогадалися, Zend Framework реалізує Memcached через Zend_Cache_Backend_Memcached. Я вирішив, що Zend_Cache_Core найбільш зручний для першого запуску в моїх програмах, я раджу вам почати саме з нього.
Прибрати підсвітку коду
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // налаштовуємо стратегію backend кешування $oBackend = new Zend_Cache_Backend_Memcached( array( 'servers' => array( array( 'host' => '127.0.0.1', 'port' => '11211' ) ), 'compression' => true ) ); // Налаштовуємо логер кешування $oCacheLog = new Zend_Log(); $oCacheLog->addWriter( new Zend_Log_Writer_Stream( 'file:///tmp/pr-memcache.log' ) ); // Налаштовуємо стратегію frontend кешування $oFrontend = new Zend_Cache_Core( array( 'caching' => true, 'cache_id_prefix' => 'myApp', 'logging' => true, 'logger' => $oCacheLog, 'write_control' => true, 'automatic_serialization' => true, 'ignore_user_abort' => true ) ); // Складаємо об'єкт кешування $oCache = Zend_Cache::factory( $oFrontend, $oBackend ); |
Тут ми створили нову сутність Zend_Cache_Core (frontend) і Zend_Cache_Backend_Memcached, які використовують Zend_Log для логування.
Налаштування Zend_Cache_Backend_Memcached:
servers
Список серверів, розділених комами, які повинна використовувати ця сутність.
compression
Визначає, чи мають дані бути стислі до того, як вони будуть записані.
Налаштування Zend_Cache_Core:
caching
включення кешування. Це зручно, якщо ви хочете залишити перемикач включено / вимкнено для виключення кешування з процесу. У моїх програмах, я передаю тут змінні Zend_Config.
cache_id_prefix
Це значення, яке буде підставлятися перед id (індексом) кожного кешованого об'єкту.
logging
Це включає логування для даного backend. Ви повинні вказати logger в опції `logger`, яка описана нижче.
logger
Це повинна бути сутність Zend_Log, який ви хочете використовувати для логування.
write_control
це виконує постійну перевірку, коли які-небудь дані пишуться в кеш. Це безпечніше, але повільніше.
automatic_serialization
Включення цієї опції дозволить вам прозоро проводити дані, які не є рядками або числами. Наприклад, ви можете провести сутність Zend_Xml_Config без попередньої серіалізаціі, з розрахунком на те, що ви зможете прочитати її з кешу.
ignore_user_abort
Якщо ця опція встановлена, ignore_user_abort буде встановлюватися як true під час того, як буде записуватися кеш. Це допомагає запобігти спотворенню даних.
Коли все налаштовано й позначено, ми об'єднуємо його з Zend_Cache:: factory(), що дає нам повністю налаштоване кешування об'єктів. Тепер ми можемо використовувати кешування об'єктів в нашому коді:
Прибрати підсвітку коду
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $sCacheId = 'LargeDataSet'; if ( ! $oCache->test( $sCacheId ) ) { // Кешу немає, значить ми повинні отримати дані складним шляхом $aDataSet = doExpensiveQuery(); $oCache->save( $aDataset, $sCacheId ); } else { // кеш отримано, завантажуємо з memcache $aDataSet = $oCache->load( $sCacheId ); } |
Логіка доволі проста. По-перше, ми перевіряємо чи виконується memcache сервер, щоб визначити, чи існують дані і чи використовуються вони. Якщо ні, ми завантажуємо дані як звичайно, без кешування. Якщо вони доступні, ми просто завантажуємо їх з memcache і робимо, що нам потрібно.
Відзначте, що якщо ви не встановлюєте automatic_serialization, як ми зробили вище, ви можете використовувати набагато простішу конструкцію. Коли ви зберігаєте рядки, і Zend_Cache не робить вам ніяких змін, дані не перевіряються на цілісність (наскільки я розумію, вони можуть бути правильно перетворені з послідовної форми в паралельну).
Прибрати підсвітку коду
1 2 3 4 5 6 7 8 9 10 11 | //------------------------------------------------ ------------ / / Простіша конструкція, коли automatic_serialization вимкнено //------------------------------------------------ ------------ $sCacheId = 'LargeDataSet'; if ( ! ( $aDataSet = $oCache->load( $sCacheId ) ) ) { // кешу немає, так що ми повинні отримати дані складним шляхом $aDataSet = doExpensiveQuery(); $oCache->save( $aDataset, $sCacheId ); } |
Зверніть увагу, що ви зберігаєте декілька рядків і все, що вам потрібно, це обернути існуючий код в єдиний блок if. Тільки запам'ятайте - якщо це не рядок або число, вам потрібно буде виконати serialize / deserialize самостійно.
Висновок
Реалізація Memcached в Zend Framework надиво проста. Якщо у вас є відповідні ресурси і достатньо прав для встановлення Memcached, я не уявляю собі причину, за яку ви не захочете цього зробити. Завдяки кільком додатковим рядкам коду ваш додаток може миттєво стати більш продуктивним і легким в масштабуванні.
Оригінал: Memcached in PHP Made Easy With Zend Framework
Рейтинг:




<< Ви можете поставити оцінку цій статтіПодібні статті:
Інтеграція FCKeditor в Zend_Form
Автоматизоване тестування з використанням Zend Framework
Паттерн кешування для моделей
Zend Framework і переклад
Два (або більше) проекти Zend Framework на спільному хостингу