gearman作业服务器的工作心得

  最近在做一个学习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学到的新知识也会写在这.

原文地址:https://www.cnblogs.com/tudou1223/p/4353183.html