Memcached в PHP - просто з Zend Framework

Мітки: zend framework, кешування, memcache

Memcached в PHP - просто с Zend Framework Memcached в PHP - просто с Zend Framework
Memcached in PHP Made Easy With Zend Framework Memcached in PHP Made Easy With Zend Framework

Застосувати 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 найбільш зручний для першого запуску в моїх програмах, я раджу вам почати саме з нього.
Прибрати підсвітку коду
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
<?php
// налаштовуємо стратегію 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
<?php
$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
<?php
//------------------------------------------------ ------------ 
/ / Простіша конструкція, коли 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

Рейтинг: 12345   << Ви можете поставити оцінку цій статті


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


 
 

Залишити коментар:

Ім'я


E-mail


Повідомлення