Успешно подключили 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
Похоже, что обратные вызовы не запускаются при работе в фоновом режиме ..