Страница 1 из 2
Не получается заставить работать gearman
Добавлено: 2014.09.10, 02:29
nepster
Установил gearman на сервере.
Прикрепил вот этот вот пакет
https://github.com/filsh/yii2-gearman
Создал тестовый скрипт:
Код: Выделить всё
<?php
namespace common\jobs;
use filsh\yii2\gearman\JobBase;
class Activate extends JobBase
{
public function execute(\GearmanJob $job = null)
{
echo 'Activate execute';
}
}
Пробую запустить на сервере:
Код: Выделить всё
Success: Process is started
Error: GearmanWorker::work(): gearman_wait(GEARMAN_TIMEOUT) timeout reached, no servers were available -> libgearman/universal.cc:328
Собственно только пытаюсь освоить герман и еще не понял некоторые моменты:
class Activate extends JobBase это воркер ?
Re: Не получается заставить работать gearman
Добавлено: 2014.09.10, 02:46
mickgeek
Re: Не получается заставить работать gearman
Добавлено: 2014.09.10, 14:39
nepster
Было 0.8, сейчас поставил 1.1.2
Подскажите пожалуйста следующее:
1) использовать просто стороний пакет или расширение для yii2 ?
2)
use Sinergi\Gearman\JobInterface;
use GearmanJob;
Код: Выделить всё
class JobExample implements JobInterface
{
public function getName()
{
return 'JobExample';
}
public function execute(GearmanJob $job)
{
// Do something
}
}
это сам воркер или функция, которая будет доступна в воркере ?
3) воркер нужно будет запустить с помощью супервизора и организовать вызов функции для выполнения заданий ?
Re: Не получается заставить работать gearman
Добавлено: 2014.09.10, 14:59
mickgeek
Так та ошибка то исчезла?
1. Разница в удобстве.
2.
http://habrahabr.ru/post/142210 писал(а):Вкратце словами: скрипт, которому требуются результаты/действия работы функции (“client”) отправляет на сервер (регистрирует) имя функции и ее аргументы — на сервере создается задача (“task”).
Если на сервере зарегистрирован обработчик для функции с таким именем (“worker”) и он в данный момент свободен, ему передаются данные для обработки и имя ф-и в виде задачи (“job”). Если worker для такой ф-и не зарегистрирован или он занят, task становится в очередь и ждет обработки.
3. Можно визором, можно без. Просто
php /path/to/app/yii gearman/start --fork=true в автозагрузку.
Re: Не получается заставить работать gearman
Добавлено: 2014.09.10, 19:16
anton44eg
Оффтоп.
Мне в последнее время Beanstalkd намного больше нравится
Re: Не получается заставить работать gearman
Добавлено: 2014.09.10, 23:41
nepster
mickgeek
да ошибка исчезла, типа процесс запущен.
Читал эту статью как раз вот не понял парочку моментов именно по ней. Скорее всего по тому, что никогда с подобными вещами ранее дел не имел. Разбираюсь по пару минут в день, так как завален своим проектом.
Вот честно я включу дурака, но еще раз переспрошу. Тоесть:
Вначале нам нужен воркер, который следит что там как:
Тут есть пример такого воркера.
Код: Выделить всё
<?php
$worker = new GearmanWorker();
$worker->addServer('192.168.68.4');
/*Тут мы говорим, что готовы обработать ф-ю function_revert_string_and_caps, и что заниматься этим будет ф-я 'revCaps*/
$worker->addFunction('function_revert_string_and_caps', 'revCaps');
/*Запускаем воркер. В таком варианте он отработает один раз*/
$worker->work();
/*А это вариант будет висеть демоном - есть на видео*/
//while($worker->work()){};
//Ну и сама ф-я обработчик, аргумент один - объект-задание job
function revCaps($job){
/*Извлекаем из job данные, переданные клиентом*/
$content = $job->workload();
return mb_strtoupper(strrev($content));
}
1)
Тоесть воркер у нас весит демоном в фоне и выполняет какую-либо функцию, в данном случае revCaps?
2)
Вот это я так понял именно функция, которую и будет обслуживать воркер ? (как в примере: revCaps)
Код: Выделить всё
namespace common\jobs;
use filsh\yii2\gearman\JobBase;
class SyncCalendar extends JobBase
{
public function execute(\GearmanJob $job = null)
{
// Do something
}
}
3) Как я понял, чтобы добавить задание в очередь в фон, мне нужно использовать вот этот код ?
Код: Выделить всё
Yii::$app->gearman->getDispatcher()->background('syncCalendar', new JobWorkload([
'params' => [
'data' => 'value'
]
])); // run in background
4) Тоесть к примеру я запускаю задачу, то она летит в функцию SyncCalendar->execute() ?
5) И ключевой вопрос, где мой воркер ? При использовании расширения к Yii2? Тоесть сейчас я успешно запустил процесс командой:
yii gearman/start --fork=true
И в воркерах я вижу вот это:
6) Но в фон ничего такого как в статье описано я не ставил. Тоесть за меня это все сделал Yii2?
7)
1. Разница в удобстве.
Есть еще какае-то разница? тоесть использовать именно расширение под Yii2 или общее расширение ?
anton44eg
А подскажите пожалуйста почему ?
За ранее огромное спасибо за ответы.
Re: Не получается заставить работать gearman
Добавлено: 2014.09.11, 00:21
anton44eg
Клиенты для всех популярных языков, не нужно расщирение для php. Более продвинутый функционал.
Re: Не получается заставить работать gearman
Добавлено: 2014.09.11, 21:13
mickgeek
Лучше я просто покажу рабочий код на примере расширения yii2-gearman. После запуска некоторые моменты точно прояснятся.
common/config/main.php:
Код: Выделить всё
'components' => [
'gearman' => [
'class' => 'filsh\yii2\gearman\GearmanComponent',
'jobs' => [
'test' => ['class' => 'common\jobs\TestJob'],
],
],
],
'controllerMap' => [
'gearman' => [
'class' => 'filsh\yii2\gearman\GearmanController',
'gearmanComponent' => 'gearman',
],
],
common/jobs/TestJob:
Код: Выделить всё
namespace common\jobs;
use GearmanJob;
use Yii;
use filsh\yii2\gearman\JobBase;
class TestJob extends JobBase
{
public function execute(GearmanJob $job = null)
{
$params = $this->getWorkload($job)->getParams();
$id = $params['id'];
$framework = $params['framework'];
// your code...
}
}
backend/controllers/DefaultController:
Код: Выделить всё
namespace backend\controllers;
use Yii;
use yii\web\Controller;
use filsh\yii2\gearman\JobWorkload;
class DefaultController extends Controller
{
public function actionIndex()
{
return Yii::$app->gearman->getDispatcher()->background('test', new JobWorkload([
'params' => [
'id' => uniqid(),
'framework' => 'yii',
],
]));
}
}
Запускаем процесс
yii gearman/start --fork=true и переходим по экшену.
Насколько я помню, чтобы всё работало корректно, необходимо передавать в функцию какое-либо уникальное значение. Если мы передаём экземпляр модели, то там уже есть, как минимум, уникальный идентификатор.
А на счёт удобства... Мне просто приятнее придерживаться единого стиля Yii. Да и в принципе, удобно, когда меньше кода (а используя расширение, его будет меньше) ;)
Re: Не получается заставить работать gearman
Добавлено: 2014.09.12, 21:27
nepster
Большое спасибо, все заработало. Но все-же осталось еще 2 вопроса =)
1) я так и не понял, где вообще сидит воркер и как он живет ? Тоесть я перезапускал германа, но процесс yii gearman всеравно висел.
2) Как можно настроить работу конкретного воркера именно синхронно ? А если задание провалилось, тоесть вернуло false, то остановить все следующие задания. Тоесть не удалить их, а просто остановить выполнение.
Re: Не получается заставить работать gearman
Добавлено: 2014.09.12, 22:30
mickgeek
1. Воркеры висят на сервере в виде процессов. Gearman же отправляет воркеру задачу. Этот процесс довольно неплохо описан всё в той же статье на Хабре :)
2. Думаю, лучше использовать какое-либо хранилище (Memcache, БД, файл или что-то другое). Честно говоря, ни разу не сталкивался с подобной задачей.
Re: Не получается заставить работать gearman
Добавлено: 2014.09.12, 22:55
nepster
1) да это понятно, я только конкретно именно про это расширение. Оно воркер само как-то ставит ?
2) буду использовать MySql. А есть идеи, как остановить вообще задачи ?
Я сделал тестовую штуку
Код: Выделить всё
public function execute(\GearmanJob $job = null)
{
$start = microtime(true);
$params = $this->getWorkload($job)->getParams();
$id = $params['id'];
$task = $params['task'];
$dir = __DIR__.'/../../test-jobs/';
$string = '';
for($i = 0, $c = 0; $i <= 30; $i++, $c++) {
sleep(1);
$separator = '';
if($c == 5) {
$separator = PHP_EOL . PHP_EOL;
$c = 0;
}
$string .= $i.' '.$separator;
}
$time = microtime(true) - $start;
$string .= PHP_EOL . PHP_EOL . '----------------------------------------------------------------------';
$string .= 'id = '.$id.'; task = '.$task;
$string .= PHP_EOL . PHP_EOL . '----------------------------------------------------------------------';
$string .= PHP_EOL . 'Выполнено за: ' . $time;
$fp = fopen($dir.time().".txt", "w");
fwrite($fp, $string);
fclose($fp);
return true;
}
запустил ее раз 10. Оно по порядку создавало файлы. Вообще логично предположить если 1 воркер, то он выполняет задачи синхронно, если несколько то параллельно, это правильное утверждение ? Но в любом случае, нужно остановить все задачи если 1 упала. Например если идет дерево вложенности и мы добавляем новый узел. Если он добавляется секунд 10, мы кидаем задачу в фон, а если узел по какой-то причине не добавится а пойдут следующие, то это нарушит структуру дерева.
Re: Не получается заставить работать gearman
Добавлено: 2014.09.14, 14:41
mickgeek
1. Да.
Утверждение правильное, задачи ставятся в очередь. Боюсь ошибиться в своих предположениях по поводу остановки конкретного воркера. Лучше воспользоваться поисковиком.
В закладках нашёл
такую презентацию, может будет полезной.
Re: Не получается заставить работать gearman
Добавлено: 2014.09.26, 15:56
belkod
С Германом давно работал еще. Дело в том, что воркер - это отдельный процесс в системе. И его можно убить через системную функцию линукса. И насколько помню герман может отдать список воркеров и их состояние. Герман смотри сколько стоит задач на воркер, Если кол-во задач превышает кол-во воркеров, то могут запускаться дополнительные воркеры.
Re: Не получается заставить работать gearman
Добавлено: 2014.10.10, 14:28
bzz
Может не много не в ту тему, но может кто подскажет как с помощью этого расширения запустить много одинаковых воркеров и что бы они работали асинхронно?
Сейчас у меня запускается два разных воркера по одному экземпляру, причем второй воркер ничего не делает (даже если для него есть таски) пока не закончит первый.
Re: Не получается заставить работать gearman
Добавлено: 2015.06.12, 11:56
rusnire
anton44eg писал(а):Оффтоп.
Мне в последнее время Beanstalkd намного больше нравится
Решил тоже попровать. Установил. Запускаю, выдает
Код: Выделить всё
# php yii worker
Process Control Extension is loaded. Signal Handling Registered!
Exception 'ReflectionException' with message 'Class udokmeci\yii2beanstalk does not exist'
Почему так?
Re: Не получается заставить работать gearman
Добавлено: 2015.06.12, 12:48
anton44eg
Как подключали udokmeci\yii2beanstalk?
Re: Не получается заставить работать gearman
Добавлено: 2015.06.12, 13:23
rusnire
anton44eg писал(а):Как подключали udokmeci\yii2beanstalk?
В общем написал самому разрабу. Он много что спрашивал, потом сказал проверить строчку и выслал мне ее
'beanstalk'=>[
'class' => 'udokmeci\yii2beanstalk\Beanstalk',
Я просто скопировал и заменил. ПРОФИТ! Работает, что весьма странно. Теперь страшно заново сайт собирать
Re: Не получается заставить работать gearman
Добавлено: 2015.06.12, 13:31
rusnire
anton44eg писал(а):Как подключали udokmeci\yii2beanstalk?
А что можете посоветовать, чтобы отслеживать воркеры и вообще контролировать beanstalk?
Re: Не получается заставить работать gearman
Добавлено: 2015.06.12, 14:03
anton44eg
Я работал через Pheanstalk. Довольно удобный интерфейс
Re: Не получается заставить работать gearman
Добавлено: 2015.06.12, 14:17
rusnire
anton44eg писал(а):Я работал через Pheanstalk. Довольно удобный интерфейс
Это он?
https://github.com/pda/pheanstalk
Он идет сразу в udokmeci\yii2beanstalk как я вижу. И как им пользоваться? Это только в ssh?