Gearman worker manager
Инструмент для управления работниками Gearman на PHP.
Изучен и взят за основу проект brianlmoon/GearmanManager, код которого немного устарел. Инструмент добавляет обработчик заданий в формате «один файл — одна функция». Нет команды остановки.
Однако автор выражает большую благодарность этому проекту, так как большая часть логики взята из него.
Особенности инструмента:
start
, reload
, restart
, stop
и status
. Перезапуск не влияет на выполнение заданий, работники ждут завершения текущей задачи перед выходом;examples
можно запускать сразу после установки Gearmand server;curl
, telnet
, monitor
и logger
;Поддерживается только среда Linux. Требуется расширение PHP
pcntl
иposix
. На macOS инструмент также должен работать, но не тестировался. Версия PHP должна быть от 5.6 до < 7.0.0 (расширение Gearman для PHP не поддерживает версию 7).
Получение и установка:
"require": {
"inhere/gearman": "dev-master"
},
git clone http://github.com/inhere/php-gearman-manager
Основные команды:
// запуск
php examples/gwm.php
php examples/gwm.php start
// фоновый режим
php examples/gwm.php -d
php examples/gwm.php --daemon
php examples/gwm.php stop
php examples/gwm.php restart
Другие команды:
// просмотр справки для получения дополнительной информации о доступных опциях
php examples/gwm.php --help
// вывод информации о конфигурации менеджера
php examples/gwm.php -D
Снимок экрана:
Команды и опции:
В командной строке с помощью php examples/gwm.php -h
можно просмотреть все команды и опции. Ниже приведены лишь некоторые из них.
Опции командной строки переопределяют параметры файла конфигурации.
root@php5-dev:/var/www/phplang/library/gearman-manager# php examples/gwm.php -h
Gearman worker manager(gwm) script tool. Version 0.1.0
USAGE:
php examples/gwm.php {COMMAND} -c CONFIG [-v LEVEL] [-l LOG_FILE] [-d] [-w] [-p PID_FILE]
php examples/gwm.php -h
php examples/gwm.php -D
COMMANDS:
start Start gearman worker manager (default)
stop Stop running's gearman worker manager
restart Restart running's gearman worker manager
reload Reload all running workers of the manager
status Get gearman worker manager runtime status
SPECIAL OPTIONS:
start/restart
-w,--watch Automatically watch and reload when 'loader_file' has been modify (TODO)
-d,--daemon Daemon, detach and run in the background
--jobs Only register the assigned jobs, multi job name separated by commas(',') // 设定只加载这几个job handler,防止其他的job干扰。测试时很有用,
--no-test Not add test handler, when job name prefix is 'test'.(eg: test_job) // 不加载以test为前缀的handler。如在生产环境时
status
--cmd COMMAND Send command when connect to the job server. allow:status,workers.(default:status) // 查看job server的信息
--watch-status Watch status command, will auto refresh status.
PUBLIC OPTIONS:
-c CONFIG Load a custom worker manager configuration file
-s HOST[:PORT] Connect to server HOST and optional PORT, multi server separated by commas(',')
-n NUMBER Start NUMBER workers that do all jobs
-u USERNAME Run workers as USERNAME
-g GROUP_NAME Run workers as user's GROUP NAME
-l LOG_FILE Log output to LOG_FILE or use keyword 'syslog' for syslog support
-p PID_FILE File to write master process ID out to
-r NUMBER Maximum run job iterations per worker // 启动多少个worker来做job。这些worker是随机接收并处理job。如需对某个job特殊处理,需单独配置它
-x SECONDS Maximum seconds for a worker to live
-t SECONDS Number of seconds gearmand server should wait for a worker to complete work before timing out
-v [LEVEL] Increase verbosity level by one. (eg: -v vv | -v vvv)
-h,--help Shows this help information
-V,--version Display the version of the manager
-D,--dump [all] Parse the command line and config file then dump it to the screen and exit.
Добавление обработчика заданий:
Метод-прототип: bool BaseManager::addHandler(string $name, mixed $handler, array $opts = [])
bool BaseManager::addFunction(string $name, mixed $handler, array $opts = []) // addHandler 的别名方法
Параметры:
$name
string — наименование, которое присваивается данной работе.$handler
mixed — обработчик данной работы. Может быть именем функции, именем класса, экземпляром объекта или замыканием. Если используется имя класса или экземпляр объекта, то они должны реализовывать интерфейс app\gearman\JobInterface
(рекомендуется) или иметь метод __invoke
.$opts
array — некоторые настройки для текущей работы.
timeout
int — время ожидания в секундах.worker_num
int — количество рабочих, необходимых для выполнения этой работы.focus_on
bool — требуется, чтобы указанные рабочие были сосредоточены на этой работе, т. е. занимались только ею и не брали другие задания.Пример:
// $mgr — это экземпляр inhere\gearman\LiteManager|inhere\gearman\Manager
$mgr->addHandler('test_echo_job', \inhere\gearman\examples\jobs\EchoJob::class);
// Для этого задания специальные настройки — как минимум 4 рабочих будут выполнять эту работу, и эти рабочие также будут выполнять другие задания
$mgr->addHandler('my_job', MyJob::class, [
'worker_num' => 4,
]);
// Для этого задания специальные настройки — 2 рабочих будут сосредоточены на выполнении этого задания, не принимая другие задания
$mgr->addHandler('my_other_job', MyOtherJob::class, [
'worker_num' => 2,
'focus_on' => 1,
]);
Все параметры конфигурации можно найти в BaseManager::$config
.
Можно настроить задание с помощью специальных параметров. Доступные параметры:
// BaseManager::$defaultJobOpt
[
// Требуется 'worker_num' рабочих для обработки этого задания
'worker_num' => 0,
// Когда установлено focus_on = true, эти рабочие будут сосредоточены на этом задании
'focus_on' => false, // true | false,
// Время ожидания выполнения задания в секундах
'timeout' => 200,
]
Предоставляет простой класс для записи файлов журнала.
Чтобы создать каталог для хранения файлов, выполните:
FileLogger::create(__DIR__ . '/logs/jobs', FileLogger::SPLIT_DAY);
Для использования:
... ...
FileLogger::info('message', ['data'], 'test_job');
FileLogger::err('message', ['data'], 'test_job');
Также встроен класс inhere\gearman\jobs\UseLogJob
job handler. При использовании класса job и наследовании от него можно легко регистрировать события.
Пример использования:
use inhere\gearman\jobs\UseLogJob;
class MyJob extends UseLogJob
{
/**
* {@inheritDoc}
*/
protected function doRun($workload, \GearmanJob $job)
{
$this->info("received workload=$workload");
$this->err("error ...");
echo "receive: $workload\n";
}
}
Предоставляется базовый класс задания для переадресации запросов: inhere\gearman\jobs\RequestProxyJob
.
Это базовый класс для заданий по переадресации запросов. Нужно только сосредоточиться на проверке данных и настройке правильных $baseUrl
(адрес API) и $path
(путь API) (необязательно $method
).
Если данные не важны, а нужно просто выполнить некоторую логику асинхронно, можно использовать:
StdHostProxyJob
— универсальный класс задания прокси-сервера проекта, который наследуется от RequestProxyJob
. Он подходит для внутренних интерфейсов проекта, где данные передаются без изменений.$mgr->addHandler('user_api', new StdHostProxyJob('http://user.domain.com'));
$mgr->addHandler('goods_api', new StdHostProxyJob('http://goods.domain.com'));
В клиенте:
$client->doBackground('user_api', [
'_uri' => '/update-info', // будет запрос: http://user.domain.com/update-info
'userId' => 123,
// ... ...
]);
StdApiProxyJob
— для некоторых часто используемых интерфейсов запросов можно создать отдельный обработчик, чтобы избежать смешивания с другими запросами.$mgr->addHandler('refreshToken', new StdApiProxyJob('http://user.domain.com', '/refreshToken'));
В клиенте:
$client->doBackground('refreshToken', [
'userId' => 123,
'token' => 'xxdd',
// ... ...
]);
Для более сложных требований к API, когда необходимо выполнить дополнительную обработку данных перед пересылкой, можно создать собственный класс, унаследованный от inhere\gearman\jobs\RequestProxyJob
, и добавить необходимую логику.
Пример создания собственного класса:
class UserAfterRegisterJob extends RequestProxyJob
{
protected function beforeSend(array &$payload)
{
if (!isset($payload['userId']) || $payload['userId'] <= 0) {
return false;
}
$this->baseUrl = 'http://inner-api.domain.com';
$this->path = '/user/after-register';
return true;
}
}
Встроенный простой монитор веб-панелей, который позволяет просматривать информацию о сервере, заданиях и рабочих. Также есть встроенный анализ журналов.
Это лишь базовая реализация, но предоставляются соответствующие классы инструментов, которые можно настроить под свои нужды.
Чтобы запустить сервер, выполните команду:
bash server.sh
// OR
php -S 127.0.0.1:5888 -t web
Затем откройте браузер и перейдите по адресу http://127.0.0.1:5888. Вы увидите следующие страницы:
BSD
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )