最近在做一个学习app的api工作,有些统计方面的mysql自然交给队列去处理,昨天一迁移数据库就发现有些试卷的信息 作业服务器没有收到,可能是因为试卷题目量大了的原因,导致gearman work堵住了,所以gearman 的日志没有生成,表示 它根本没有接受到任务.
原来的代码是
客户端:
//用的do系列 $client = new GearmanClient(); $client->addServer(); $client->doBackground("stat",json_encode(array('stat'=>$stat,'item_list'=>$item_detail)));//异步工作进程,返回处理work ID $client->do("stat",json_encode(array('stat'=>$stat,'item_list'=>$item_detail)));//同步工作进程,返回work函数的return值
服务端:
$worker = new GearmanWorker(); $worker->addServer(); // 接受客户端的stat任务派发,并把它传递给study_stat函数 $worker->addFunction("stat","study_stat"); // 无际循环运行,gearman内部已有处理,不会出现占用过高死掉的情况 while ($worker->work()); function study_stat($job) { $data = json_decode($job->workload(),true); //处理代码省略 }
平常运用下是没问题的,但是昨天开始就会出现没有接受到任务的情况.所以今天早上换成了队列,代码如下:
客户端:
$client = new GearmanClient(); $client->addServer('127.0.0.1',4730); $client->addTaskBackground("stat",json_encode(array('stat'=>$stat,'item_list'=>$item_detail)));//异步队列
$client->addTask("stat",json_encode(array('stat'=>$stat,'item_list'=>$item_detail)));//同步队列
$client->runTasks();//运行队列中的任务,只是do系列不需要runTask()
服务端:
$worker= new GearmanWorker(); $worker->addServer('127.0.0.1',4730); $worker->addFunction("stat",function (GearmanJob $job) { $data = json_decode($job->workload(),true);//接受传递的JSON
//处理代码省略
}
特意加上了服务器IP和端口,防止出错,然后测试了一遍,还没出现问题.以后使用gearman学到的新知识也会写在这.