2012-01-12 3 views
3

У меня есть простой клиент и работник Gearman. Я запускаю оба на рабочем столе Ubuntu. Я установил пакет gearman-beta pecl и версию Gearman из синаптики.PHP Gearman Задача иногда возвращает пустой объект

Моя проблема в том, что иногда Я получаю пустой объект от рабочего. Около 50% времени он показывает ожидаемый текст, остальное время он отображает «GearmanTask объект ( )» (от моего print_r в клиенте)

Ни в одной точке происходит исключение, клиент всегда считает, что работник успешно завершил свою работу. Я также должен отметить, что нет тайм-аутов, скрипт клиента выполняется быстро.

Client

$gmclient = new GearmanClient(); 
$gmclient->addServer(); 

$gmclient->addTask('test','just some text'); 
$gmclient->setCompleteCallback("complete"); 
$gmclient->setFailCallback('fail'); 
$gmclient->runTasks(); 

function fail() { 
    echo "FAIL"; 
} 
function complete($task) { 
    print "COMPLETE: " . $task->data() . "<br />"; 
    if($task->data() == '') { 
    echo '<pre>'.print_r($task, true).'</pre><br />'; 
    echo $task->error(); 
    } 
} 

рабочий (test.php)

$worker = new GearmanWorker(); 
$worker->addServer(); 
$worker->addFunction("test", "test_function"); 
while (true) { 
    $worker->work(); 
    print $worker->returnCode(); 
} 
function test_function($job) { 
    return $job->workload() . ' worked!'; 
} 

Я не имею ничего в/вар/войти/Gearman-работы-сервера.

Мысли?

ответ

0

Это может показаться странным, но для меня это работало.

Вы должны заменить следующий блок

$gmclient = new GearmanClient(); 
$gmclient->addServer(); 

$gmclient->addTask('test','just some text'); 
$gmclient->setCompleteCallback("complete"); 
$gmclient->setFailCallback('fail'); 
$gmclient->runTasks(); 

с этим

$gmclient = new GearmanClient(); 
$gmclient->addServer(); 

$gmclient->setCompleteCallback("complete"); 
$gmclient->setFailCallback('fail'); 

$gmclient->addTask('test','just some text'); 
$gmclient->runTasks(); 
Смежные вопросы