Gearman PHP, sendComplete не имеет никакого эффекта - PullRequest
3 голосов
/ 05 июля 2011

Успешно подключили Gearman к существующему проекту PHP. Используя supervisord, чтобы убедиться, что работники работают, это дало довольно хорошие результаты!

У меня есть критическая проблема, однако, в том, что setCompleteCallback вообще не работает.

Разделитесь примерно так:

Клиент

$client = new GearmanClient();
$client->addServer();
$client->setCompleteCallback( 
    array( 'LDPE_Service_AWSConnect_Transfer_Target', 'transferComplete' ) );

// push core to S3 bucket
$target = new LDPE_Service_AWSConnect_Transfer_Target( $transaction->id,
    "/usr/local/include/LDP/", LDPE_Service_S3::BUCKET_CORE );

// push S3 bucket to instances
foreach( $aws_target_list as $dns )
{
    $target->addChildRequest( 
        new LDPE_Service_AWSConnect_Transfer_Target( $transaction->id, 
                null, LDPE_Service_S3::BUCKET_CORE, $dns )
    );
}


$client->addTaskBackground( 'transferStart', serialize( $target ) );        
$client->runTasks();

рабочий

(в основном загружает среду Zend Framework и загружает функции exec)

include 'bootstrap.php';    

ini_set('memory_limit', -1);


$worker = new GearmanWorker();
$worker->addServer();

$worker->addFunction( 'transferStart', array( 
        'LDPE_Service_AWSConnect_Transfer_Target', 'transferStart' ) );

while ($worker->work())
{
    switch( $worker->returnCode() )
    {
        case GEARMAN_SUCCESS:
        break;

        default:
            echo "ERROR RET: " . $worker->returnCode() . "\n";
            exit;   
    }
}

Наконец, вот класс LDPE_Service_AWSConnect_Transfer_Target, который содержит всю тяжелую работу. Я исключил всю логику, и она совсем не срабатывает.

Методы реализации

class LDPE_Service_AWSConnect_Transfer_Target {

    public static function transferStart( GearmanJob $job )
    {

        $workload   = $job->workload();
        $target     = unserialize( $workload );

        echo "transferStart/begin [ " . 
                $target->getShortRepresentation() . " ]\n";
        // perform a series of actions

        echo "transferStart/complete [ " . 
                $target->getShortRepresentation() . " ]\n"; 
        return serialize( $target );
    }


    public static function transferComplete( GearmanTask $task )
    {
        echo "transferComplete/begin\n";

        $workload       = $task->data();
        $parent_target  = unserialize( $workload );


        echo "transferComplete/complete\n";
    }
}

Для ясности, строки "TransferStart / begin" и "TransferStart / complete" правильно печатаются в журналах, однако, TransferComplete / begin никогда не запускается. Что происходит?

Спасибо! Alex


Похоже, что обратные вызовы не запускаются при работе в фоновом режиме ..

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Попробуйте установить обратный вызов после вашего вызова функции процесса

$client->addTaskBackground('my_task', 'payload');
$client->setCompleteCallback('complete');
$client->runTasks();
0 голосов
/ 06 июля 2011

Я пробовал это, все сводилось к тому, что клиент запускался как задача Gearman.Клиент вызывался как часть страницы, вызываемой браузером.Кажется, что обратный вызов не был соблюден в этом контексте.Решением было переместить клиента, который планирует обратные вызовы, в метод Gearman-run.Я добавил функцию «scheduleXXXX» в работу, которая в значительной степени называется вышеупомянутым потоком.Эта функция получила вход «нормальной» функции, сериализованный.

...