1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/inhere-php-gearman-manager

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README_zh.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 06:48 45602aa

Gearman worker manager

Инструмент для управления работниками Gearman на PHP.

Изучен и взят за основу проект brianlmoon/GearmanManager, код которого немного устарел. Инструмент добавляет обработчик заданий в формате «один файл — одна функция». Нет команды остановки.

Однако автор выражает большую благодарность этому проекту, так как большая часть логики взята из него.

Особенности инструмента:

  • возможность одновременного запуска и управления несколькими работниками Gearman, а также мониторинг их состояния. В случае аварийного завершения работы работник автоматически перезапускается;
  • настройка максимального времени выполнения (по умолчанию около часа) и максимального количества выполняемых заданий (по умолчанию 3000) для каждого работника. После достижения этих значений работник автоматически перезапустится, чтобы предотвратить зависание процесса;
  • возможность настройки количества работников и привязки их к определённым заданиям. Также можно настроить специализацию работников на конкретных задачах;
  • простой и понятный код с подробными комментариями;
  • поддержка команд 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).

Получение и установка:

  1. Через Composer:
"require": {
    "inhere/gearman": "dev-master"
},
  1. Из GitHub: 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,
]);

manager 配置

Все параметры конфигурации можно найти в BaseManager::$config.

job 配置

Можно настроить задание с помощью специальных параметров. Доступные параметры:

// 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";

    }
}

Запрос переадресации Job handler

Предоставляется базовый класс задания для переадресации запросов: 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/inhere-php-gearman-manager.git
git@api.gitlife.ru:oschina-mirror/inhere-php-gearman-manager.git
oschina-mirror
inhere-php-gearman-manager
inhere-php-gearman-manager
master