Gearman в связке nginx+php-fpm (версия PHP 5.3) на Debian
Если Вы решили разработать свой web-сервис, то Вам просто не обойтись без сервера очередей. Среди всех доступных серверов есть один, достаточно интересный, экземпляр – Gearman. Из основных достоинств этого сервера можно выделить: OpenSource, скорость работы и простота использования.
Единственная проблема, которая у Вас может возникнуть, это проблема с его установкой. Устанавливается просто, но есть небольшие нюансы.
Я устанавливал его на Debian и поэтому приведу подробную инструкцию здесь, чтобы не забыть план действий.
Исходные данные
Будем считать, что web-сервер у нас уже установлен. В системе используется sudo, хоть и его нет их коробки в Debian.
Установка Gearman в Debian
Ставим Gearman:
sudo apt install gearman-job-server
Устанавливаем клиента для php-fpm. Хотелось бы сразу пояснить, что версия этого клиента зависит от используемой версии PHP: если версия ниже PHP < 5.3, то используйте 1.1.2, если используется PHP = 5.3, то 1.0.3.
sudo apt install php-pear make libgearman-dev
sudo pecl install gearman-1.0.3
echo 'extension=gearman.so' > sudo /etc/php5/fpm/conf.d/gearman.ini
Перезапускаем php5 и Gearman:
sudo service gearman-job-server restart
sudo service php5-fpm restart
Проверка работоспособности
Для того, чтобы проверить нашу работу:
php --info | grep "gearman support"
gearman support => enabled
Как использовать?
Идеологию Gearman объяснять, думаю, излишне, поэтому сразу к делу. В примерах будем, как по хрестоматии, отправлять электронные письма.
Клиент
Пример клиента client.php
:
<?php
$mail = array(
'to' => 'ваше_имя@gmail.com',
'subject' => 'Привет',
'body' => 'Это тестовое сообщение'
);
# Подключаемся к серверу Gearman
$client = new GearmanClient();
$client->addServer('127.0.0.1', '4730');
# Шлем сообщение
$client->doBackground('sendmail', json_encode($mail));
Воркер
Пример воркера worker.php
:
<?php
$worker = new GearmanWorker();
$worker->addServer('127.0.0.1', 4730);
$worker->addFunction('sendmail', 'send_mail');
while (1) {
$worker->work();
if ($worker->returnCode() != GEARMAN_SUCCESS) break;
}
function send_mail($job) {
$workload = $job->workload();
$data = json_decode($workload, true);
mail($data['to'], $data['subject'], $data['body']);
}
Запуск воркера в работу
Запускаем воркер командой:
php worker.php &
Команда должна исполняться из той же директории, в которой лежит воркер.
Мониторинг
Для мониторинга в дальнейшем, можно пользоваться командой:
(echo status) | netcat 127.0.0.1 4730
sendmail 0 0 0 1
где
- столбец – названия функций для которых есть либо задачи, либо есть воркеры
- столбец – общее количество задач для функции
- столбец – количество задач в обработке
- столбец – количество запущенных воркеров для данной функции
Теги: