Запуск и остановка рабочих в gearman php

Я успешно настроил и использовал gearman и его расширение pecl php. Я использую его для выполнения длительного процесса, связанного с длинными запросами sql в фоновом режиме. Кстати, я использую Yii, если эта деталь поможет.

Вот как я его использую:

public function actionProcessWithGearman(){

$output = shell_exec('gnome-terminal -e "php workers/worker.php" > /dev/null 2>/dev/null &');


$client = new GearmanClient();
$client->addServer();
$result = $client->doBackground('executeJob',//parameters);

}

Некоторые подробности:

Если вы заметили, что я сначала запускаю gnome-терминал, чтобы видеть процесс, а не напрямую с помощью команды php я также добавил /dev/null, чтобы он больше не ждал ответа. И тогда работник просыпается и запускает работу.

Проблема:

Моя проблема возникает, когда это действие выполняется несколько раз или выполняется несколькими пользователями в разных клиентах, и в результате создается несколько терминалов с запущенным worker.php.

Как мне иметь только одного работника? и даже если я могу иметь несколько работников для нескольких пользователей в разных клиентах, как закрыть работника каждый раз, когда задача завершена?


person muffin    schedule 28.10.2014    source источник


Ответы (3)


Вы можете попробовать добавить returnCode() и jobStatus().

Образец здесь - http://php.net/manual/en/gearmanclient.dobackground.php

person cupid    schedule 28.10.2014

Если у вас есть система очередей, рабочие всегда должны работать в фоновом режиме и быть готовыми к приему новых заданий.

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

Gearman обычно хорошо ладит с супервайзером. Супервайзер будет контролировать работника и следить за тем, чтобы он всегда был доступен. Если вам нужно, чтобы одновременно выполнялось более одного задания, вы всегда можете добавить нового работника.

Просто найдите gearman + супервизор + php, есть много статей, объясняющих, как это настроить.

person Laurent F    schedule 29.10.2014

Позволить супервизору заботиться о запуске и мониторинге php-процессов — это правильный путь.

У этого подхода есть несколько плюсов: например, вы можете позволить супервизору автоматически запускать воркеры, даже несколько экземпляров. И вы даже можете управлять супервизорными процессами через xmlrpc, если предпочитаете управлять своими воркерами из собственного веб-интерфейса (http://supervisord.org/api.html)

Пример конфигурации супервизора

[program:worker_development]
process_name=worker_%(process_num)s
command=php worker.php
directory=/var/ww/myproject
autorestart=true
user=ubuntu
redirect_stderr=false
numprocs=2
startretries=5
person paul.ago    schedule 23.12.2014