Я успешно настроил и использовал 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);
}
Некоторые детали:
Если вы заметили, я бегу гном-терминал во-первых, чтобы я мог видеть процесс, а не идти прямо с команда php, Я также добавил / DEV / нуль так что больше не будет ждать ответа. И тогда рабочий просыпается и запускает работу.
Проблема:
Моя проблема возникает, когда это действие выполняется несколько раз или выполняется несколькими пользователями в разных клиентах, и, как результат, работает несколько терминалов worker.php в настоящее время создаются
Как у меня только один работник? и даже если у меня может быть несколько работников для нескольких пользователей в разных клиентах, Как мне закрыть работника каждый раз, когда задача завершена?
Вы можете попробовать добавить returnCode () и jobStatus ().
Образец здесь — http://php.net/manual/en/gearmanclient.dobackground.php
Если у вас есть система очередей, рабочие всегда должны работать в фоновом режиме и быть готовыми к поиску новых заданий.
Я думаю, что есть недоразумение в логике системы очередей. Вы должны просто добавить новую работу, которая будет обрабатываться работником, и не запускать работника, если вы хотите, чтобы работа была выполнена.
Gearman обычно хорошо сочетается с руководителем. Супервайзер будет контролировать работника и следить за тем, чтобы он всегда был доступен. Если вам нужно одновременно запустить более одного задания, вы всегда можете добавить нового работника.
Просто посмотрите на gearman + supervisor + php, там много статей, объясняющих, как это настроить.
Позволить руководителю позаботиться о запуске и мониторинге 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