Використання Memcached для кешування PHP-даних у ServBay
ServBay — це потужне локальне середовище для веб-розробки, яке вже постачається з високопродуктивним пакетом Memcached (Memcached server) та відповідним PHP-розширенням. Завдяки цьому розробники можуть швидко організувати ефективне кешування даних у PHP-додатках і суттєво підвищити продуктивність своїх застосунків.
У цій статті докладно розглянемо, як перевірити та використовувати Memcached і відповідне PHP-розширення в середовищі ServBay.
Коротко про Memcached
Memcached — це високопродуктивна розподілена система кешування об'єктів у пам'яті. Записуючи тимчасові дані (наприклад, результати запитів до бази, відповіді API, фрагменти сторінок тощо) безпосередньо в оперативну пам'ять, Memcached суттєво зменшує навантаження на бекенд-сховища (наприклад, на базу даних), що значно прискорює динамічні веб-застосунки і підвищує їх пропускну здатність.
Основні переваги
- Висока продуктивність: Дані зберігаються в оперативній пам'яті — надшвидке читання й запис.
- Розподіленість: Можна легко створити розподілений кластер кеша на багатьох серверах; масштабування майже необмежене.
- Простота інтеграції: Простий протокол, безліч клієнтських бібліотек, максимальна легкість підключення.
- Зменшення навантаження на базу даних: Значно скорочує кількість запитів до БД, особливо у сценаріях з високим рівнем одночасних звернень.
Порівняння PHP-розширень: memcache vs memcached
У PHP є два популярних розширення для взаємодії з Memcached сервером: memcache та memcached. Хоч їхні назви схожі, це різні інструменти з відмінним API та функціональними можливостями:
Розширення
memcache:- Одне з перших розширень для роботи з Memcached у PHP.
- Працює із процедурним API (
memcache_connect(),memcache_set()тощо). - Функції доволі базові, деякі сучасні можливості відсутні (наприклад, консистентне хешування, хоча це можна знайти в деяких клієнтських бібліотеках).
Розширення
memcached:- Сучасніше розширення на базі бібліотеки libmemcached.
- Орієнтоване на об'єктно-орієнтоване програмування (клас
Memcached). - Підтримує додаткові фічі: консистентне хешування, бінарний протокол, аутентифікацію через SASL, гнучкі опції серіалізації тощо.
- Рекомендується до використання саме
memcached, оскільки воно багатше за функціоналом і активно підтримується.
За замовчуванням у ServBay встановлено та рекомендовано використовувати саме розширення memcached.
Memcached-сервер та PHP-розширення у ServBay
ServBay не тільки інтегрує сервер Memcached як керований софтверний пакет, а й для кожної версії PHP, що входить в комплект, попередньо встановлює і активує розширення memcached за замовчуванням.
Інакше кажучи: після встановлення ServBay у вас вже готовий до роботи і Memcached-сервер, і PHP-розширення — жодних додаткових налаштувань чи компіляції не потрібно.
Перевірка статусу пакету Memcached:
У головному вікні або інтерфейсі керування пакетами ServBay знайдіть пакет Memcached і переконайтеся, що його статус — "запущено". Якщо не запущено, спробуйте запустити його.
Перевірка, чи завантажено розширення memcached у PHP:
Найпростіший спосіб для певної версії PHP — скористатись функцією phpinfo():
У кореневій папці сайту ServBay (типово
/Applications/ServBay/www) створіть новий PHP-файл, наприклад,info.php.Додайте до файлу такий код:
php<?php phpinfo(); ?>1
2
3Відкрийте цей файл у браузері через налаштований у ServBay домен (наприклад,
http://servbay.demo/info.php).На сторінці phpinfo знайдіть розділ "memcached". Якщо ви бачите секцію з такою назвою з інформацією про налаштування і версію — розширення завантажено і готове до використання.
Використання Memcached в PHP-коді
Як тільки переконалися, що Memcached-сервер працює, а розширення memcached активне, можете використовувати клас Memcached у своєму PHP-додатку для підключення та кешування.
За замовчуванням Memcached-сервер у ServBay працює на localhost і слухає порт 11211.
Приклад коду
Нижче наведено простий приклад використання класу Memcached для підключення до локального Memcached-серверу, встановлення та отримання даних з кешу.
Збережіть цей код у вашому сайті ServBay (наприклад, у файлі /Applications/ServBay/www/memcached_test.php):
php
<?php
// Інформація про сервер Memcached
$memcached_host = 'localhost';
$memcached_port = 11211;
// Створення екземпляра клієнта Memcached
$memcached = new Memcached();
// Додаємо сервер Memcached до пула з'єднань клієнта
// Метод addServer() повертає булеве значення — чи вдалося додати до списку (не гарантує, що з’єднання встановлено)
if (!$memcached->addServer($memcached_host, $memcached_port)) {
// Увага: невдала addServer зазвичай свідчить про проблеми у конфігурації, а не про недоступність сервера
die("Не вдалося додати сервер Memcached до списку клієнта. Перевірте хост і порт у налаштуваннях.");
}
// Щоб перевірити підключення, спробуємо отримати неіснуючий ключ (опціонально, але бажано)
// get() повертає false або порожній масив, якщо ключа немає або щось не так із з'єднанням
// Для більш детального аналізу можна використати Memcached::getResultCode()
$test_key = 'servbay_memcached_connection_test';
$memcached->get($test_key); // Спробувати отримати неіснуючий ключ
$result_code = $memcached->getResultCode();
if ($result_code !== Memcached::RES_NOTFOUND && $result_code !== Memcached::RES_SUCCESS) {
// Якщо не RES_NOTFOUND і не RES_SUCCESS, можливо проблеми з підключенням
// Зауважте: RES_SUCCESS також може повертатись при порожньому значенні
// Для суворішої перевірки потрібна додаткова логіка або спеціальна поведінка клієнта
// Для локальної розробки — якщо addServer спрацював, а далі немає помилок, вважаємо, що все добре
echo "Увага: можливі проблеми з підключенням до Memcached. Код результату: " . $result_code . "<br>";
// У реальних застосуваннях слід організувати детальніше оброблення помилок
} else {
echo "Успішне підключення до сервера Memcached ({$memcached_host}:{$memcached_port}).<br>";
}
// --- Приклади роботи з кешем ---
// Дані для кешування
$key = 'user_profile_1234';
$data = [
'id' => 1234,
'username' => 'servbay-demo',
'email' => 'demo@servbay.test',
'status' => 'active'
];
$expiration = 3600; // Час життя кешу, сек. (тут — 1 година)
// Запис даних у кеш
// set() повертає true/false (успіх/невдача)
if ($memcached->set($key, $data, $expiration)) {
echo "Дані успішно закешовано у Memcached, ключ '{$key}', термін дії $expiration сек.<br>";
} else {
echo "Не вдалося закешувати дані!<br>";
// Причину можна дізнатися через $memcached->getResultCode()
echo "Код результату: " . $memcached->getResultCode() . "<br>";
}
// Спроба отримати дані з кешу
echo "Пробуємо отримати дані з кешу...<br>";
$cachedData = $memcached->get($key);
if ($cachedData !== false) { // Memcached::get() повертає false при промаху або збої
echo "Дані успішно отримано з кешу:<br>";
echo "<pre>";
print_r($cachedData);
echo "</pre>";
} else {
echo "Кеш не знайдено чи помилка при отриманні, ключ '{$key}'.<br>";
echo "Код результату: " . $memcached->getResultCode() . "<br>";
}
// Демонстрація ситуації після закінчення терміну дії кешу
// У реальних проектах завжди перевіряйте, чи повернуло get() false — якщо так, треба отримувати дані з основного джерела й повторно кешувати.
// Приклад: видалення даних з кешу
/*
echo "Пробуємо видалити дані з кешу...<br>";
if ($memcached->delete($key)) {
echo "Дані успішно видалено з кешу, ключ '{$key}'.<br>";
} else {
echo "Видалення з кешу не вдалося!<br>";
echo "Код результату: " . $memcached->getResultCode() . "<br>";
}
// Спробуємо ще раз отримати вже видалені дані
echo "Повторна спроба отримати видалені дані...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "Дані знайдено (видалення не виконано):<br>";
print_r($cachedDataAfterDelete);
} else {
echo "Дані відсутні у кеші (як і очікується).<br>";
echo "Код результату: " . $memcached->getResultCode() . "<br>";
}
*/
// Приклад: очищення всього кешу (уважно!)
/*
echo "Пробуємо очистити увесь кеш...<br>";
if ($memcached->flush()) {
echo "Весь кеш успішно очищено.<br>";
} else {
echo "Очищення кешу не вдалося!<br>";
echo "Код результату: " . $memcached->getResultCode() . "<br>";
}
*/
?>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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Відкрийте файл memcached_test.php у браузері через локальний сайт, налаштований у ServBay, щоб побачити результати перевірки з'єднання та операцій кешування.
Корисні поради
- Переконайтеся, що пакет Memcached у ServBay запущений.
- За замовчуванням Memcached очікує підключень на IP
127.0.0.1(абоlocalhost), порт11211. У більшості випадків налаштування змінювати не потрібно. - Якщо не виходить підключитися до Memcached з PHP — перевірте, чи запущений пакет, і чи не блокує локальні з'єднання фаєрвол.
- Метод
addServerкласуMemcachedлише додає сервер до списку підключень, але не встановлює постійне з’єднання чи негайно перевіряє доступність. З’єднання і перевірка відбувається при подальших викликах таких методів якget,setтощо. Для перевірки успіху звертайте увагу на повернуті значення та код ізgetResultCode().
Висновок
ServBay надає розробникам максимально простий шлях до використання Memcached. Завдяки інтегрованому серверу Memcached та вже встановленому й ввімкненому розширенню memcached для PHP, ви можете без зайвих кроків налагоджувати ефективне кешування даних у локальному середовищі та впевнено створювати високопродуктивні PHP-додатки.
