Assargin
@Assargin
Перед ответом смотрю наличие ✔ в ваших вопросах

PHP и Gearman, что и как?

Здравствуйте!


Интересуют следующие аспекты работы с Gearman в PHP:


— чем концептуально отличается GearmanJob от GearmanTask и какой из них следует использовать для оформления отложенного задания?


— везде в интернете описывается режим работы, когда и воркер, и клиент — демоны. Можно ли демоном сделать только воркера, а клиентскую часть, которая будет помещать задания в Gearman — оформить в коде, вызываемом по HTTP. Чтобы, скажем, обратился я к странице, которая отображает результат длительной операции, в коде формирования страницы ставится задание, а пользователю отдается «Try later». Пользователь жмет F5, вновь запущенный код, что задание уже поставлено и имеет определенный статус выполнения, и возвращает его, или — если задание выполнено — отобразит его результат?


— этот вопрос вытекает из предыдущего: понятно дело, когда клиент — демон, он поставил задание и просто ждет результата, или регулярно опрашивает Gearman на предмет результата, имея handle поставленного задания. В документации php.net/manual/ru/book.gearman.php я не нашел способа, как вновь запущенному скрипту. имея ID задачи, который самому можно задавать. спросить у сервера о ее статусе. handle имеет текстовый вид («H:CompName:4», H:CompName:5, ..), но тут едва ли подойдет так как их нумерация начинается сначала после падения/перезапуска Gearman, Опытным путем я выяснил, что повторный запуск doBackground с теми же параметрами, что и в прошлый раз. вернут тот же handle, НО это если только задача еще в процессе выполнения. Когда задача выполнена, повторный ее запуск будет воспринят как совершенно новая задача. Городить стороннее хранилище, в которое клиент будет помещать задачи (помимо того что он их Gearman'у отдает). а воркер рапортовать о результатах выполнения?


Пользуясь случаем, хочу еще узнать: если вы имели дело с этой темой, какое из решений вы выбрали для организации выполнения отложенных задач? Я в настоящее время выбираю между RabbitMQ, Gearman и php-resque.
  • Вопрос задан
  • 9324 просмотра
Решения вопроса 1
konst20
@konst20
Программист, преподаватель, немного электронщик
Доброго :)
Отвечаю на вопросы

— чем концептуально отличается GearmanJob от GearmanTask и какой из них следует использовать для оформления отложенного задания?

Job — это то, что поступает воркеру.
Task — это то, что передает клиент

То есть клиент кидает Task на сервер очередей, там два агрумента — имя ф-и и сериализованные данные (в виде строки).
Если у воркера есть ф-я, указанная в Task, то есть он готов ее обработать, то он принимает задачу, а данные получает в виде Job.
Извлекаются данные вот так (кусок реального кода):

function create_campaign(GearmanJob $job){

$rawData = $job->workload();
$data = unserialize($rawData);


А передаются на сервер вот так (я использую не Task, а чуть проще — просто doBackground)

$gclient = new GearmanClient();
$gclient->addServer('localhost');

$new_offers = $client_db->select_new_offers();

if(is_array($new_offers) AND count($new_offers) > 0){
foreach($new_offers as $item){
$data_for_gearman = array(
'item' => $item,
'client_class_name' => 'axxa',
);
$gclient->doBackground('new_offer', serialize($data_for_gearman));
}
}

echo «Для добавления товаров на сервер очередей добавлено ».count($new_offers)." задач \n";
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
konst20
@konst20
Программист, преподаватель, немного электронщик
Пользуясь случаем, хочу еще узнать: если вы имели дело с этой темой, какое из решений вы выбрали для организации выполнения отложенных задач? Я в настоящее время выбираю между RabbitMQ, Gearman и php-resque.

Gearman — великолепен. Я свой выбор сделал
Ответ написан
Комментировать
konst20
@konst20
Программист, преподаватель, немного электронщик
у меня демоны — только воркеры
Ответ написан
konst20
@konst20
Программист, преподаватель, немного электронщик
их можно запускать из консоли или скриптом.
кстати, я готовлю новую публикацию — веб-интерфейс для сервера очередей. Он давно готов, сыроват, но рабочий, я его юзаю, руки не доходят
Вот код
code.google.com/p/gearman-monitor-and-control/
Ответ написан
Комментировать
konst20
@konst20
Программист, преподаватель, немного электронщик
— этот вопрос вытекает из предыдущего: понятно дело, когда клиент — демон, он поставил задание и просто ждет результата, или регулярно опрашивает Gearman на предмет результата…

Я делаю «в лоб» — как только задачи определенной группы начали выполняться, я делаю инкремент одной переменной в БД, как только задача завершается — делаю декремент. В итоге, когда хоть какие-то задачи выпоняются — переменная отлична от 0, как готовы все — там 0. Из веб-приложения аяксом просто опрашиваю БД
Ответ написан
Комментировать
konst20
@konst20
Программист, преподаватель, немного электронщик
Есть ли стандартный способ из клиентского скрипта посмотреть, что сейчас происходит с данной задачей, не запуская ее на выполнение вновь. если она выполнена?

Еще момент: воркер может в процессе выполнения передавать клиенту промежуточные данные.
Посмотрите, в моей публикации есть пример с кодом и видео
Ответ написан
@justthefish
Пользуясь случаем, хочу еще узнать: если вы имели дело с этой темой, какое из решений вы выбрали для организации выполнения отложенных задач? Я в настоящее время выбираю между RabbitMQ, Gearman и php-resque.

Уже выбрали, RabbitMQ.
Причина правда не в том, что кролик удобнее для отложенных заданий, а в том, что
1) используется не только PHP, а у rabbitmq очень хорошие биндинги к популярным языкам (не знаю как у gearman)
2) через очередь передаются не только задания, но и «сырые» данные. В rabbitmq это делать (на мой взгляд) удобнее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы