Не получается заставить работать gearman

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Не получается заставить работать gearman

Сообщение 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';
    }
    
} 

Пробую запустить на сервере:

Код: Выделить всё

./yii gearman/start --fork=true

Код: Выделить всё

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 это воркер ?
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Не получается заставить работать gearman

Сообщение mickgeek »

Gearman какой версии в phpinfo()?

https://github.com/sinergi/gearman#requirements
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Не получается заставить работать gearman

Сообщение 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) воркер нужно будет запустить с помощью супервизора и организовать вызов функции для выполнения заданий ?
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Не получается заставить работать gearman

Сообщение mickgeek »

Так та ошибка то исчезла?

1. Разница в удобстве.
2.
http://habrahabr.ru/post/142210 писал(а):Вкратце словами: скрипт, которому требуются результаты/действия работы функции (“client”) отправляет на сервер (регистрирует) имя функции и ее аргументы — на сервере создается задача (“task”).

Если на сервере зарегистрирован обработчик для функции с таким именем (“worker”) и он в данный момент свободен, ему передаются данные для обработки и имя ф-и в виде задачи (“job”). Если worker для такой ф-и не зарегистрирован или он занят, task становится в очередь и ждет обработки.
https://github.com/filsh/yii2-gearman писал(а):yii gearman/start --fork=true // start the workers as a daemon and fork proces
3. Можно визором, можно без. Просто php /path/to/app/yii gearman/start --fork=true в автозагрузку.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Не получается заставить работать gearman

Сообщение anton44eg »

Оффтоп.
Мне в последнее время Beanstalkd намного больше нравится
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Не получается заставить работать gearman

Сообщение 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

И в воркерах я вижу вот это:

Код: Выделить всё

http://c2n.me/iTbXYL.png 
6) Но в фон ничего такого как в статье описано я не ставил. Тоесть за меня это все сделал Yii2?

7)
1. Разница в удобстве.
Есть еще какае-то разница? тоесть использовать именно расширение под Yii2 или общее расширение ?




anton44eg
А подскажите пожалуйста почему ?


За ранее огромное спасибо за ответы.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Не получается заставить работать gearman

Сообщение anton44eg »

Клиенты для всех популярных языков, не нужно расщирение для php. Более продвинутый функционал.
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Не получается заставить работать gearman

Сообщение 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. Да и в принципе, удобно, когда меньше кода (а используя расширение, его будет меньше) ;)
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Не получается заставить работать gearman

Сообщение nepster »

Большое спасибо, все заработало. Но все-же осталось еще 2 вопроса =)

1) я так и не понял, где вообще сидит воркер и как он живет ? Тоесть я перезапускал германа, но процесс yii gearman всеравно висел.
2) Как можно настроить работу конкретного воркера именно синхронно ? А если задание провалилось, тоесть вернуло false, то остановить все следующие задания. Тоесть не удалить их, а просто остановить выполнение.
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Не получается заставить работать gearman

Сообщение mickgeek »

1. Воркеры висят на сервере в виде процессов. Gearman же отправляет воркеру задачу. Этот процесс довольно неплохо описан всё в той же статье на Хабре :)
2. Думаю, лучше использовать какое-либо хранилище (Memcache, БД, файл или что-то другое). Честно говоря, ни разу не сталкивался с подобной задачей.
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Не получается заставить работать gearman

Сообщение 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, мы кидаем задачу в фон, а если узел по какой-то причине не добавится а пойдут следующие, то это нарушит структуру дерева.
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Не получается заставить работать gearman

Сообщение mickgeek »

1. Да.

Утверждение правильное, задачи ставятся в очередь. Боюсь ошибиться в своих предположениях по поводу остановки конкретного воркера. Лучше воспользоваться поисковиком.

В закладках нашёл такую презентацию, может будет полезной.
belkod
Сообщения: 52
Зарегистрирован: 2014.01.04, 21:56

Re: Не получается заставить работать gearman

Сообщение belkod »

С Германом давно работал еще. Дело в том, что воркер - это отдельный процесс в системе. И его можно убить через системную функцию линукса. И насколько помню герман может отдать список воркеров и их состояние. Герман смотри сколько стоит задач на воркер, Если кол-во задач превышает кол-во воркеров, то могут запускаться дополнительные воркеры.
bzz
Сообщения: 5
Зарегистрирован: 2011.05.04, 18:31

Re: Не получается заставить работать gearman

Сообщение bzz »

Может не много не в ту тему, но может кто подскажет как с помощью этого расширения запустить много одинаковых воркеров и что бы они работали асинхронно?
Сейчас у меня запускается два разных воркера по одному экземпляру, причем второй воркер ничего не делает (даже если для него есть таски) пока не закончит первый.
rusnire
Сообщения: 167
Зарегистрирован: 2015.05.25, 09:51

Re: Не получается заставить работать gearman

Сообщение rusnire »

anton44eg писал(а):Оффтоп.
Мне в последнее время Beanstalkd намного больше нравится
Решил тоже попровать. Установил. Запускаю, выдает

Код: Выделить всё

# php yii worker
Process Control Extension is loaded. Signal Handling Registered!
Exception 'ReflectionException' with message 'Class udokmeci\yii2beanstalk does not exist'
 
Почему так?
Будущее за нами | Спасибо разработчикам yii2 и всему русскому комьюнити по нему
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Не получается заставить работать gearman

Сообщение anton44eg »

Как подключали udokmeci\yii2beanstalk?
rusnire
Сообщения: 167
Зарегистрирован: 2015.05.25, 09:51

Re: Не получается заставить работать gearman

Сообщение rusnire »

anton44eg писал(а):Как подключали udokmeci\yii2beanstalk?
В общем написал самому разрабу. Он много что спрашивал, потом сказал проверить строчку и выслал мне ее
'beanstalk'=>[
'class' => 'udokmeci\yii2beanstalk\Beanstalk',

Я просто скопировал и заменил. ПРОФИТ! Работает, что весьма странно. Теперь страшно заново сайт собирать :D
Будущее за нами | Спасибо разработчикам yii2 и всему русскому комьюнити по нему
rusnire
Сообщения: 167
Зарегистрирован: 2015.05.25, 09:51

Re: Не получается заставить работать gearman

Сообщение rusnire »

anton44eg писал(а):Как подключали udokmeci\yii2beanstalk?
А что можете посоветовать, чтобы отслеживать воркеры и вообще контролировать beanstalk?
Будущее за нами | Спасибо разработчикам yii2 и всему русскому комьюнити по нему
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Не получается заставить работать gearman

Сообщение anton44eg »

Я работал через Pheanstalk. Довольно удобный интерфейс
rusnire
Сообщения: 167
Зарегистрирован: 2015.05.25, 09:51

Re: Не получается заставить работать gearman

Сообщение rusnire »

anton44eg писал(а):Я работал через Pheanstalk. Довольно удобный интерфейс
Это он? https://github.com/pda/pheanstalk

Он идет сразу в udokmeci\yii2beanstalk как я вижу. И как им пользоваться? Это только в ssh?
Будущее за нами | Спасибо разработчикам yii2 и всему русскому комьюнити по нему
Ответить