齿轮和多个卷曲请求

时间:2014-08-05 20:28:03

标签: php curl gearman

如何与gearman并行运行多个curl请求,我对文档有些疑惑:

我的问题是:
1。我在哪里运行RunCurl();客户或工人的职能?
2。我是否需要将$ job引用传递给RunCurl();功能?
第3。 addFunction('lookup_user')定义在哪里?

public function RunCurl()
{
//do curl request 
//get list of IP's from database
//run Curl request


}

客户端

public function parallel_client()

{
$client = new GearmanClient();
$client->addServer();

// initialize the results of our 3 "query results" here
$userInfo ='single';
$friends ='none';
$posts = 'jones';

// This sets up what gearman will callback to as tasks are returned to us.
// The $context helps us know which function is being returned so we can 
// handle it correctly.
$client->setCompleteCallback(function(GearmanTask $task, $context) use (&$userInfo, &$friends, &$posts) {
    switch($context) {
        case 'lookup_user':
            $userInfo = $task->data();      
            break;
        case 'baconate':
            $friends = $task->data();
            break;
        case 'get_latest_posts_by':
            $posts = $task->data();
            break;
    }
});

// Here we queue up multiple tasks to be execute in *as much* parallelism as gearmand can give us
$client->addTask('lookup_user', 'joe@joe.com', 'lookup_user');
$client->addTask('baconate', 'joe@joe.com', 'baconate');
$client->addTask('get_latest_posts_by', 'joe@joe.com', 'get_latest_posts_by');

echo "Fetching...\n";
$start = microtime(true);
$client->runTasks();
$totaltime = number_format(microtime(true) - $start, 2);

echo "Got user info in: $totaltime seconds:\n";
var_dump($userInfo, $friends, $posts);


}

工人

public function parallel_worker()
{
$worker = new GearmanWorker();
$worker->addServer();

$worker->addFunction('lookup_user', function(GearmanJob $job){
    // normally you'd so some very safe type checking and query binding to a database here.
    // ...and we're gonna fake that.
    //sleep(3);
    //$this->RunCurl();
    return 'The user requested ('. $job->workload() .') is 7 feet tall and awesome!';
});

$worker->addFunction('baconate', function(GearmanJob $job){
   // sleep(3);
    return 'The user ('. $job->workload() .') is 1 degree away from Kevin Bacon';
});

$worker->addFunction('get_latest_posts_by', function(GearmanJob $job){
   // sleep(3);
    return 'The user ('. $job->workload() .') has no posts, sorry!';
});

while ($worker->work());


}

1 个答案:

答案 0 :(得分:1)

  
      
  1. 我在哪里运行RunCurl();客户或工人的功能?
  2.   

我相信你想要在你的工人身上。我说'相信',因为在一天结束时,你可以在哪里放置它,但是如果你希望从你的网络服务器处理RunCurl()电话( 客户),然后你需要把它放在工人。

  
      
  1. 我是否需要将$ job引用传递给RunCurl();功能?
  2.   

最有可能。如果要将数据传递给worker或者从worker返回数据(或调用作业上的任何其他函数,例如sendException),那么实际上只需要传入的作业引用。您可能至少需要为您的员工提供某种输入,尽管这不是必需的。

  
      
  1. addFunction('lookup_user')定义在哪里?
  2.   

addFunction方法是在PECL Gearman扩展中的GearmanWorker对象上定义的。请参阅该类here的文档,或参阅此函数的C源代码here

最后但并非最不重要的是,您的整体问题:如何与gearman并行运行多个curl请求?

齿轮机背后的想法是将处理卸载到旨在处理特定工作的其他工作。在处理齿轮手时基本上有三种类型的呼叫:“火和忘记”,你把工作交给工人,然后忘记它(我认为齿轮装置最擅长),“阻止”服务电话客户将在哪里实际上坐着等待工作人员返回一些数据,然后在“发送状态更新”中发送作业,然后将状态更新从工作人员发送回客户端。

您可以通过启动一大堆工作进程然后向这些工作人员提交一堆作业来并行处理多个服务调用。 gearmand本身只不过是一个排队服务,可以跟踪工作人员的注册/可用情况,并在他们进入可用工作人员时分配工作。一旦工人找到工作,在工作完成之前就不再可用了。通过运行多个工作进程,您理论上可以并行处理一些有限数量的任务(并行处理的任务数等于您启动的工作进程数)。