Використання 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' => '[email protected]',
'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-додатки.