【问题标题】:Gearman PHP, sendComplete has no effectGearman PHP,sendComplete 没有效果
【发布时间】:2011-07-04 20:06:41
【问题描述】:

已成功将 Gearman 连接到现有 PHP 项目。使用supervisord来保证workers在运行,已经产生了相当不错的效果!

但是,我有一个关键问题,即“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。怎么回事?

谢谢! 亚历克斯


似乎在后台模式下运行时回调不会触发..

【问题讨论】:

    标签: php callback client gearman worker


    【解决方案1】:

    尝试设置回调您调用过程函数之后

    $client->addTaskBackground('my_task', 'payload');
    $client->setCompleteCallback('complete');
    $client->runTasks();
    

    【讨论】:

      【解决方案2】:

      我已经尝试过了,它真的归结为让客户端作为 Gearman 任务本身运行。客户端作为浏览器调用页面的一部分被调用。在这种情况下似乎没有兑现回调。解决方案是将调度回调的客户端移动到 Gearman-run 方法中。我在工作中添加了一个“scheduleXXXX”函数,它几乎称为上面的流程。此函数接收“正常”函数的输入,并进行序列化。

      【讨论】:

      • (指的是下面 Yarek 的评论)
      猜你喜欢
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      相关资源
      最近更新 更多