如何与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);
}
<<h2>工人/h2>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());
}
- 在哪里运行RunCurl();作用于客户端还是工作端?
我相信你希望你的员工是这样的。我说"相信",因为在一天结束的时候,它取决于你把它放在哪里,但是如果你想要RunCurl()
调用被处理掉你的web服务器(其中是客户端),那么你需要把它放在worker中。
- 我需要传递$job引用到RunCurl();函数?
最有可能。只有在向worker传递数据或从worker传递数据(或调用作业上的任何其他函数,如sendException
)时,才真正需要传入的作业引用。您可能至少需要为您的worker提供某种输入,尽管这不是必需的。
- addFunction('lookup_user')定义在哪里?
addFunction
方法定义在PECL Gearman扩展内部的GearmanWorker
对象上。请参阅此处该类的文档,或查看此处该函数的C源代码。
最后但并非最不重要的是,你的总体问题:我如何与gearman并行运行多个curl请求?
gearman背后的思想是将处理工作卸载给其他被设计用来处理特定任务的程序。在处理gearman时,基本上有三种类型的调用:"Fire and Forget",您将工作转移到worker,然后忘记它(我认为gearman最擅长),"Blocking"服务调用,客户端实际上会坐下来等待worker返回一些数据,以及"Send Me Status Updates",您将工作发送出去,然后只从worker向客户端发送状态更新。
你可以通过启动一堆工作进程,然后向这些工作进程提交一堆作业来并行处理多个服务调用。Gearmand本身只不过是一个队列服务,它跟踪哪些工人已注册/可用,并在他们进入可用工人时分配工作。一旦工人有了一项工作,它就不再可用,直到该工作完成。通过运行多个工作进程,理论上你可以并行处理一些有限数量的任务(你可以并行处理的任务数量等于你启动的工作进程的数量)。