当查看php gearman文档时,我看到有任务和做,他们都有背景和非背景,他们也都有高低和正常。
任何人都可以澄清这些吗?我对这种差异感到很困惑。
答案 0 :(得分:8)
有两个不同之处:运行顺序和目的。
运行顺序 - 当您通过do和runTasks运行某些任务时,其优先级高于任务。因此,运行顺序将通过:
<强>目的:强>
任务 - 将此用于简短任务,当您不关心完成时间或进度如何时
执行 - 将此用于复杂作业或需要检查进度时。为此目的有GearmanJob::sendStatus():
<强> worker.php 强>
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction("sleep13", array('MyWorker', 'sleep13'));
while ($worker->work());
class MyWorker {
public function sleep13($job) {
$data = unserialize($job->workload());
echo 'start ' . $data['id'] . PHP_EOL;
for($i = 0; $i < 13; $i++) {
sleep(1);
$job->sendStatus($i, 13);
}
echo 'done ' . $data['id'] . PHP_EOL;
}
}
<强> client.php 强>
$client = new GearmanClient();
$client->addServer();
// Run task
$job_handle = $client->doBackground("sleep13", serialize(array('id' => 'normal-1')));
// Check progress
$done = false;
do {
usleep(300);
$stat = $client->jobStatus($job_handle);
if (!$stat[0]) // the job is known so it is not done
$done = true;
echo "Running: " . ($stat[1] ? "true" : "false") . ", numerator: " . $stat[2] . ", denomintor: " . $stat[3] . "\n";
} while(!$done);
echo "done!\n";
$ job_handle是字符串,因此您可以将其存储在某处,然后随时进行检查。
答案 1 :(得分:7)
我已经为你做了一些研究,因为我也考虑过这个问题。
如果你运行它会立即运行(发送到作业服务器) http://www.php.net/manual/en/gearmanclient.donormal.php
待办事项
运行单个任务并返回结果的字符串表示形式。由GearmanClient和GearmanWorker决定结果的格式。
是否可以构建它们的列表,然后在GearmanClient :: Run()时运行它们。
http://www.php.net/manual/en/gearmanclient.addtask.php
任务
添加要与其他任务并行运行的任务。为所有要并行运行的任务调用此方法,然后调用GearmanClient :: runTasks()来执行工作。请注意,需要有足够的工作人员来完成所有并行运行的任务。