notby.NET Logo

Установка и настройка 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
Сборка и установка Memcached 1.6.22 через порты в FreeBSD. Выбор конфигурации сборки порта.

Дожидаемся окончание установки.

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.
-lIP-адрес, который слушает 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
Сборка и установка расширения php82-pecl-memcache-8.2 через порты в FreeBSD. Выбор конфигурации сборки порта.

2.2. Устанавливаем PECL-Memcached

cd /usr/ports/databases/pecl-memcached && make install clean
Сборка и установка расширения php82-pecl-memcached-3.2.0 через порты в FreeBSD. Выбор конфигурации сборки порта.

Расширение PECL-Memcached для PHP 8.2 успешно установлено, теперь необходимо его проверить.

2.3. Проверяем установку PECL-Memcached

Перезапускаем PHP-fpm

service php-fpm restart

Проверяем что расширение PECL-Memcached установлено в PHP. Смотрим в phpinfo(); раздел memcached или командой в консоли

php -i | grep memcached
FreeBSD вывод команды "php -i | grep memcached". Показано, что memcached поддерживает PHP и список его параметров.

Как можно видеть расширение успешно установлено и 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();