Использование Memcached для кэширования данных PHP в ServBay
ServBay — это мощная локальная среда разработки для веба, в которой предустановлены высокопроизводительный сервер Memcached и соответствующее расширение PHP. Это позволяет разработчикам легко реализовать эффективное кэширование данных в своих PHP-приложениях и значительно повысить производительность.
В этом руководстве детально описано, как проверить и использовать Memcached и связанное с ним расширение PHP в ServBay.
Кратко о Memcached
Memcached — это высокопроизводительная распределённая система кэширования объектов в памяти. Она временно хранит в ОЗУ такие данные, как результаты запросов к базе данных, ответы API, фрагменты страниц и другое, сокращая количество обращений к бэкэнд-хранилищу (например, к базе данных) и ускоряя работу динамических веб-приложений.
Основные преимущества
- Высокая производительность: данные хранятся в оперативной памяти, что обеспечивает очень быструю запись и чтение.
- Распределённость: поддержка распределённых пулов кэша между множеством серверов, что упрощает масштабирование.
- Простота использования: простой протокол, множество клиентских библиотек, лёгкая интеграция.
- Снижение нагрузки на БД: значительно уменьшает количество запросов к базе данных, особенно при высокой нагрузке.
Различия между расширениями PHP memcache
и memcached
В PHP используются два популярных расширения для подключения к серверу Memcached: memcache
и memcached
. Несмотря на схожие названия, это два разных расширения с разными API и возможностями:
Расширение
memcache
:- Более старое расширение PHP.
- Предоставляет в основном процедурный API (
memcache_connect()
,memcache_set()
и др.). - Поддерживает базовый функционал, не включает некоторые продвинутые возможности, такие как консистентное хеширование (частично реализовано в клиентах).
Расширение
memcached
:- Более современное расширение PHP (основано на библиотеке libmemcached).
- Предлагает объектно-ориентированный API (через класс
Memcached
). - Поддерживает больше возможностей, включая консистентное хеширование, бинарный протокол, аутентификацию SASL, различные способы сериализации и др.
- Обычно рекомендуется использовать именно расширение
memcached
, так как оно более функционально и активно поддерживается.
В ServBay по умолчанию предоставляется и рекомендуется к использованию расширение memcached
для PHP.
Memcached и расширение PHP в ServBay
ServBay не только интегрирует сервер Memcached как управляемый программный пакет, но и предустанавливает и по умолчанию включает расширение memcached
для всех поддерживаемых версий PHP.
Это значит, что сразу после установки ServBay сервер Memcached и расширение PHP уже готовы к работе, как правило, не требуется дополнительных сборок или настройки PHP.
Как проверить статус сервера Memcached:
Зайдите в главный интерфейс или в менеджер пакетов ServBay, найдите серверный пакет Memcached
и убедитесь, что его статус — «Работает». Если сервер не запущен, попробуйте его включить.
Как убедиться, что расширение memcached
для PHP загружено:
Чтобы проверить, подключено ли расширение memcached
для используемой вами версии PHP, проще всего воспользоваться функцией phpinfo()
:
Создайте новый PHP-файл в корневой директории сайта ServBay (по умолчанию это
/Applications/ServBay/www
), например,info.php
.Вставьте в него следующий код:
php<?php phpinfo(); ?>
1
2
3Откройте этот файл через локальный сайт, настроенный в ServBay (например, если ваш домен —
servbay.demo
, перейдите по адресуhttp://servbay.demo/info.php
).На открывшейся странице phpinfo найдите секцию «memcached». Если вы видите данную секцию с информацией о версии и настройках, значит расширение успешно загружено и готово к работе.
Использование Memcached в PHP-коде
Когда сервер Memcached работает и расширение memcached
загружено, вы можете использовать класс Memcached
для подключения и операций кэширования прямо из вашего PHP-приложения.
По умолчанию сервер Memcached слушает на localhost
, порт 11211
.
Пример кода
Ниже приведён простой пример PHP-кода, демонстрирующий, как подключиться к локальному серверу Memcached, записать и получить данные с помощью класса Memcached
.
Сохраните данный код под любым именем — например, /Applications/ServBay/www/memcached_test.php
— в каталоге вашего сайта ServBay:
<?php
// Информация о сервере Memcached
$memcached_host = 'localhost';
$memcached_port = 11211;
// Создание экземпляра клиента
$memcached = new 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: " . $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 в случае успеха
if ($memcached->set($key, $data, $expiration)) {
echo "Данные успешно закэшированы с ключом '{$key}', срок жизни {$expiration} сек.<br>";
} else {
echo "Ошибка кэширования данных!<br>";
// Уточняем причину через getResultCode()
echo "Result Code: " . $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 "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Пример поведения при истечении срока годности кэша (предполагается, что время прошло)
// Обычно в приложении необходимо проверять, что $cachedData === false, и, если так — загружать данные из источника (например, БД), а после этого записывать в кэш
// Пример: удаление данных из кэша
/*
echo "Пробуем удалить кэшированные данные...<br>";
if ($memcached->delete($key)) {
echo "Данные успешно удалены из кэша, ключ '{$key}'.<br>";
} else {
echo "Ошибка удаления данных из кэша!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
// Повторная попытка получить удалённые данные
echo "Снова пробуем получить удалённые данные...<br>";
$cachedDataAfterDelete = $memcached->get($key);
if ($cachedDataAfterDelete !== false) {
echo "Данные получены (удаление не удалось):<br>";
print_r($cachedDataAfterDelete);
} else {
echo "Данные отсутствуют в кэше (как и ожидалось).<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
// Пример: очистка всего кэша (используйте с осторожностью!)
/*
echo "Пробуем очистить весь кэш...<br>";
if ($memcached->flush()) {
echo "Все кэшированные данные были удалены.<br>";
} else {
echo "Ошибка при очистке кэша!<br>";
echo "Result Code: " . $memcached->getResultCode() . "<br>";
}
*/
?>
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 по умолчанию слушает порт
11211
на127.0.0.1
илиlocalhost
. Обычно менять параметры не требуется. - Если не удаётся подключиться к Memcached из PHP, проверьте, запущен ли сервер, и нет ли локального брандмауэра, блокирующего соединение.
- Метод
addServer
классаMemcached
только добавляет сервер в пул, но не устанавливает соединение немедленно и не проверяет его доступность. В реальности подключение и операции происходят во время вызоваget
,set
и других методов. Анализируйте их возвращаемые значения или используйтеgetResultCode()
, чтобы понять результат.
Вывод
ServBay предоставляет разработчикам максимально простой способ внедрить Memcached. Благодаря интегрированному серверу Memcached и предустановленному расширению memcached
для PHP вы сможете быстро и без лишних сложностей организовать кэширование данных в локальной среде разработки, что послужит отличной базой для создания высокопроизводительных PHP-приложений.