博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cnetos下Gearman安装使用
阅读量:6977 次
发布时间:2019-06-27

本文共 3269 字,大约阅读时间需要 10 分钟。

hot3.png

1 安装gearman

   yum默认是没有gearman源的。添加源

 rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/epel-release-6-5.noarch.rpm

  然后继续安装

yum install gearmand libgearman-devel

  然后启动gearman

  /etc/init.d/gearmand start

 

2 php安装gearman的扩展

wget http://pecl.php.net/get/gearman-1.1.2.tgz

tar -zxvf gearman-1.1.2.tgz

cd gearman-1.1.2

phpize

./configure

make && make install

安装完了会有个路径的

Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/

 

配置php.ini

在php.ini末尾加上extension=”/usr/lib64/php/modules/gearman.so”,重启apache,输出php –info |grep “gearman”或者php -m或者网页输出phpinfo()都能看到已经安装成功。
常见问题:configure时如果提示找不到php-config,请指定。如–with-php-config=/usr/local/php/bin/php-config,注意要指定完整,不要只写目录或者使用rm -rf /。

 

三、实例

client:

  1. <?php
  2. $client=newGearmanClient();
  3. $client->addServer('127.0.0.1', 4730);//本机可以直接addServer(),默认服务器端使用4730端口
  4. $client->setCompleteCallback('completeCallBack');//先绑定才有效
  5.  
  6. $result1=$client->do('say','do');//do是同步进行,进行处理并返回处理结果。
  7. $result2=$client->doBackground('say','doBackground');//异步进行,只返回处理句柄。
  8. $result3=$client->addTask('say','addTask');//添加任务到队列,同步进行?通过添加task可以设置回调函数。
  9. $result4=$client->addTaskBackground('say','addTaskBackground');//添加后台任务到队列,异步进行?
  10. $client->runTasks();//运行队列中的任务,只是do系列不需要runTask()。
  11.  
  12. echo'result1:';
  13. var_dump($result1);
  14. echo'<br/>';
  15.  
  16. echo'result2:';
  17. var_dump($result2);
  18. echo'<br/>';
  19.  
  20. echo'result3:';
  21. var_dump($result3);
  22. echo'<br/>';
  23.  
  24. echo'result4:';
  25. var_dump($result4);
  26. echo'<br/>';
  27.  
  28. //绑定回调函数,只对addTask有效
  29. functioncompleteCallBack($task)
  30. {
  31.     echo'CompleteCallback!handle result:'.$task->data().'<br/>';
  32. }
  33. worker:
  34.  
  35. <?php
  36. $worker=newGearmanWorker();
  37. $worker->addServer();
  38. $worker->addFunction('say',function(GearmanJob$job){
  39.     $workload=$job->workload();//接收client传递的数据
  40.     echo'receive data:'.$workload.PHP_EOL;
  41.     returnstrrev($workload);//仅作反转处理
  42. });
  43.  
  44. //无际循环运行,gearman内部已有处理,不会出现占用过高死掉的情况
  45. while($worker->work()){
  46.     if($worker->returnCode() !== GEARMAN_SUCCESS){
  47.         echo'error'.PHP_EOL;
  48.     }
  49. }
  50. 以上client输出:
  51.  
  52. CompleteCallback!handle result:ksaTdda
  53. result1:string(2) “od”
  54. result2:string(17) “H:iZ943bixttyZ:87″
  55. result3:object(GearmanTask)#2 (0) { }
  56. result4:object(GearmanTask)#3 (0) { }
  57.  
  58. worker输出:
  59.  
  60. receive data:do
  61. receive data:doBackground
  62. receive data:addTaskBackground
  63. receive data:addTask

复制代码

四、pcntl扩展实现粗略的多worker守护

由于worker要长驻后台时刻准备着被jobserver调用来处理job,所以worker不能死掉,网上有的解决办法是通过定时任务进行重启 worker,这应该是不错的方案。也有说进行多进程守护,但实际上php比较难实现,通过pcntl扩展是其中一种方案,主进程forck出来的子进程 来启动运行worker,相当于worker作为主进程的子进程。主进程监护着子进程,worker死掉及时启动新的一个。但如果主进程死掉呢?由于主进 程不进行什么业务处理,死掉的概率要比子进程worker死掉的概率要小不少吧。
五、linux直接运行 (这样可以防止php端运行时php挂掉无法执行)
可以现在我们的php中先写一个类:比如wxPushMsg.class 然后我们去调用它

  1. /*get data by gearman*/
  2. $data      = file_get_contents('php://stdin');//接收gearman 传递过来的data
  3. $data      = json_decode($data, true);
  4. $send_data = $data['data'];
  5. $send_tmp  = $data['tmp_id'];
  6. $send_test = $data['test'];
  7. WxPubMsg::send_batch($send_data, $send_tmp, $send_test);
  8.  
  9. 控制器端调用gearman Task
  10. $client=newGearmanClient();
  11. $client->addServer();//本机可以直接addServer(),默认服务器端使用4730端口
  12. $client->addTask('wx_push',json_encode($push_data));//
  13. $client->runTasks();//运行队列中的任务,只是do系列不需要runTask()。
  14.  
  15. 然后我们linux运行wxPushMsg ;
  16.  gearman -w -f wx_push -N /home/wwwroot/domain/modules/distr/modules/classes/wxPushMsg.class.php > /dev/null 2>&1 &
  17.  linux端查看gearman运行workes  gearman --workers

转载于:https://my.oschina.net/u/588516/blog/1353333

你可能感兴趣的文章
辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)
查看>>
Spring《五》集合的注入方式
查看>>
centos7 install 安装mysql
查看>>
Odoo 学习 【二】Environment 概览
查看>>
WPF及Silverlight中将DataGrid数据导出
查看>>
Poj1426
查看>>
web类协议脚本-飞机订票系统示例
查看>>
使用Bot Service创建Bot Framework
查看>>
[JZOJ4786]小a的强迫症
查看>>
转:浅谈Linux的内存管理机制
查看>>
boolean
查看>>
ピエタ~幸せの青い鳥~相关
查看>>
Eclipse for Tricore 的安装方法
查看>>
IE下javascript的console方法
查看>>
机器学习 LR getA()
查看>>
java如何读写json文件
查看>>
py 的 第 31 天
查看>>
文件上传至阿里云
查看>>
HDU 1711 Number Sequence (KMP 入门)
查看>>
Win2008远程多用户登陆的配置方法
查看>>