Gearman是一个分布式的任务分发处理系统。
但是它无法完成启动多线程的任务,所以在一台机器上只用Gearman无法实现并行,
即使new了很多GearmanWorker也是只有一个worker工作。
应该使用pcntl_fork()出一些子进程,在每个子进程中new一个GearmanWorker,
这样就可以实现并行处理了。
for ($i=0; $i < 10; $i++) {
if (($pid = pcntl_fork()) == 0) {
//子进程
$gmworker = new GearmanWorker();
$gmworker->addServer();
$gmworker->addFunction("sendmail", "sendmail_fn");
while($gmworker->work());
} else {
//主进程
}
}
while (1);
合理分配好任务数量和每个任务的工作量有助于提升处理速度。
还有一点很重要,GearmanClient::doBackgroud GearmanClient::addTaskBackgroud的区别,
可以参考 http://stackoverflow.com/questions/12689274/whats-the-difference-between-a-task-and-do