Установка и настройка Memcached для PHP 8.2 в FreeBSD 14
Memcached это сервис кэширования данных в оперативной памяти. Если нужно построить большую выборку данных (“Лучшие комментарии/статьи за сутки/неделю”, “Навигация по каталогу”, "Данные профиля пользователя" и другие) или обсчитать в PHP какие-то данные которые не требуются в реальном времени, то такие данные нужно кэшировать. Memcached позволяет кэшировать запросы к базе данных (MySQL, MariaDB и других) через средства PHP, чтобы снизить нагрузку на базу данных.
1. Сервер Memcached
1.1. Устанавливаем Memcached
Устанавливаем сервер кэширования Memcached.
cd /usr/ports/databases/memcached && make install clean
Дожидаемся окончание установки.
1.2. Добавляем Memcached в автозагрузку
Memcached может работать через TCP/IP или сокеты. Используем Memcached через сокеты, если веб-сервер один или нет передачи кешированной информации между серверами.
Редактируем файл /etc/rc.conf
nano /etc/rc.conf
Добавляем следующие строчки
# Memcached сервер. Режим работы через сокеты.
memcached_enable="YES"
memcached_flags="-s /var/run/memcached/memcached.sock -a 700"
Если необходима работа через TCP/IP, то вместо предыдущих добавляем эти строчки
# Memcached сервер. Режим работы через TCP/IP.
memcached_enable="YES"
memcached_flags="-l 127.0.0.1 -p 11211"
Описание основных параметров запуска Memcached:
Параметр | Описание и значения по умолчания |
---|---|
-s | Путь до сокета. Запуск в режиме socket (TCP/IP не работает). |
-a | Права доступа сокета. По умолчанию 700. |
-l | IP-адрес, который слушает Memcached. По умолчанию все адреса. |
-p | Порт, который слушает Memcached. По умолчанию 11211 TCP. |
-m | Максимальный размер объектов в мегабайтах. По умолчанию 64Mb. |
-d | Запускать как демон. |
1.3. Запускаем Memcached сервер
service memcached start
2. Расширения Memcached для PHP
Существую два независимых PECL расширения PHP для работы с Memcached серверов:
- Memcache, легкое расширение с минимальным набором функций для работы с сервером. Считается что оно более быстрое и производительное в работе.
- Memcached, расширения с полным набором функция для работы. Дает полные возможности для работы с Memcached сервером.
У этих расширений немного различается синтаксис в некоторых параметрах.
Бегло сравнив скорость работы PECL-Memcache и PECL-Memcached я разницы не заметил.
Во всех дальнейших примерах PHP скриптов я буду использовать синтаксис расширение PECL-Memcached.
Я покажу установку обоих расширений.
2.1. Устанавливаем PECL-Memcache
cd /usr/ports/databases/pecl-memcache && make install clean
2.2. Устанавливаем PECL-Memcached
cd /usr/ports/databases/pecl-memcached && make install clean
Расширение PECL-Memcached для PHP 8.2 успешно установлено, теперь необходимо его проверить.
2.3. Проверяем установку PECL-Memcached
Перезапускаем PHP-fpm
service php-fpm restart
Проверяем что расширение PECL-Memcached установлено в PHP. Смотрим в phpinfo();
раздел memcached или командой в консоли
php -i | grep memcached
Как можно видеть расширение успешно установлено и PHP поддерживает работу с сервером Memcached.
3. Проверка сервера Memcached и PHP
Проверим работу сервера Memcached следующий PHP скриптом
<?php
// Класс Memcached
$cache = new Memcached();
// Добавляем сервер Memcached (UNIX socket).
$cache->addServer('/var/run/memcached/memcached.sock',0); // Порт указывается 0
// Добавляем сервер Memcached (TCP/IP).
//$cache->addServer('127.0.0.1',11211);
// Тестовые данные для кэширования.
$data = 'Memcached сервер работает';
// Кэширование данных.
$cache->set('data_cache', $data, 15);
// data_cache - ключ, $data - данные которые кэшируются, 15 - время хранение данных в кэше.
// Вывод кешированных данных из Memcached сервера с ключом 'data_cache' на экран.
echo $cache->get('data_cache');
?>
В результате выполнения скрипта будет выведено сообщение: Memcached сервер работает.
Сервер Memcached работает в связки с PHP успешно.
4. Пример использование Memcached в PHP
Допустим нужно выводить сообщение сколько активных пользователей было за последнею минуту.
Нужно кэшировать запрос к базе данных и последующею его обработку. Так что бы запрос проходил не чаще раз в минуту.
<?php
// Класс Memcached
$cache = new Memcached();
// Добавляем сервер Memcached через сокет.
$cache->addServer('/var/run/memcached/memcached.sock',0);
// Есть данные которые не нужно обновлять чаще минуты.
// Получаем данные из кэша с ключом active_users.
$u_active = $cache->get('active_users');
// Если данных в кэше нет, выполняем следующие условие.
if (empty($u_active)){
// Выполняем SQL запрос и производим его обработку.
// Получаем например такие данные:
$u_active = 'За последнею минуту 1500 пользователей проявляли активность.';
// Кешируем полученные данные с ключом active_users и временем кэша 60 секунд.
$cache->set('active_users', $u_active, 60);
// Для проверки выводим сообщение, что данные кешированы.
echo 'Данные кэшированы.'."\n";
}
// Выводим кэшированные или свежие данные.
echo $u_active;
?>
Запускаем скрипт несколько раз и проверяем его работу.
Результат этого скрипта будет вывод сообщения За последнею минуту 1500 пользователей проявляли активность. при каждом его запуске, а вывод дополнительного сообщения Данные кэшированы. не чаще минуты (60 секунд).
Замечание по поводу кэширования запросов SQL.
Результат запроса к базам данных (MySQL, MariaDB) кэшировать нельзя. Но результат можно превратить в массив использую fetch_all и его кэшировать.
// Результат $result кэшировать нельзя.
$result = $mysqli->query('SELECT * FROM users');
// Массив $rows кэшировать можно.
$rows = $result->fetch_all();