首页 >

gearman-php的Net_Gearman库学习

后端开发|php教程gearman-php的Net_Gearman库学习
worker,Gearman,client,Job,complete
后端开发-php教程
按照这个英文帖子学习的
原文代码的备份
p2p金融源码,ubuntu中mv命令,tomcat9定时关闭,学校厕所爬虫,php获取明天时间,家seolzw
例子1:
像我们展示了Net_Geaman的基本架构,client端主要代码:
电视盒子源码,vscode怎样改表格背景,汉化的ubuntu,tomcat错误怎么排查,骷髅爬虫原型,php数据库备份与还原,seo优化的核心意义,网站上如何安装discuz论坛程序,插件模板lzw
// 一个client对象,需要jobserver信息,一个数组$client = new Net_Gearman_Client (gm::$servers);// Example1就是function name$client->Example1 (array ('date'));

worker端主要代码:

amule windows 源码,vscode编机器,ubuntu如何查询指定文件,tomcat经常gc,sqlite统计记录数,jq国家地区选择插件,前端框架切换怎么设置,梦到水里有爬虫,php 读取表,郴州网优化seo公司,建筑网站免费源码,2048网页源码,帝国cms自适应手机模板,滚动页面效果,人事信息管理系统 课程设计,共享名片小程序开源源码lzw
// worker对象,需要jobserver信息$worker = new Net_Gearman_Worker (gm::$servers);// 传入function name,给他处理Example1的能力$worker->addAbility ('Example1');// loop$worker->beginWork ();

和传统的gearman api略有差别,Net_Geaman需要用户以子类形式实现function,例如Example1.php文件代码片段:

classNet_Gearman_Job_Example1extendsNet_Gearman_Job_Common{// arg 是数组,与client里面的入参array对应publicfunctionrun($arg)    {$cmd = $arg[0];    //...return$result;    }}

例子一中的一个技巧是client调用了Example1这个不存在的方法,使用的是 _call 机制。没啥用。

例子2:
client侧引入task和set概念,这样就可以累加多个任务到一个集合,一起发出,client片段:

$set=new Net_Gearman_Set();$task=new Net_Gearman_Task ('Example1', array ('date'));$set->addTask ($task);$client->runSet ($set);

例子3:
增加了完成任务后的回调功能,回调的参数有function name,句柄(包好jobserver:number,主要是唯一标识一下这次任务),还有任务的返回值。

$task->attachCallback ("complete",Net_Gearman_Task::TASK_COMPLETE);//...function complete ($func, $handle, $result) {    gm::log_msg ("[gm_client] complete ($handle/$func)");    gm::log_msg ("[gm_client] result: " . $result['result']);}

例子4:
主要是展示通过complete回调回传数据。
例子5:
展示client端添加fail回调,当function中抛出Net_Gearman_Job_Exception异常时候,会触发 fail类型的回调,代码片段:

classNet_Gearman_Job_Example3extendsNet_Gearman_Job_Common{publicfunctionrun($arg)    {if (count ($arg) != 1)        {            thrownew Net_Gearman_Job_Exception ("must provide exactly one command to run");        }        //...
$task->attachCallback ("complete",Net_Gearman_Task::TASK_COMPLETE);$task->attachCallback ("fail",Net_Gearman_Task::TASK_FAIL);//...function fail ($task) {    gm::log_msg ("[gm_client] fail, task: " . print_r ($task, true));}

但异常内容并不会回传给fail回调函数,所以还是建议使用正常的complete回调,用户可以自己捕获失败信息放到返回值里面。
例子6:
worker里面使用了monitor功能,代码片段:

$worker->beginWork ('monitor');// ...functionmonitor($idle, $time_of_last_job){$idle_str = ($idle) ? 'idle' : 'not idle';    $time_of_last_job_str = date ('r', $time_of_last_job);    gm::log_msg ("[gm_worker] status: $idle_str, time of last job: $time_of_last_job_str");}

其触发事件有:
job开始前。
job完成后。
等待job时候,一分钟触发一次。

例子7:
主要是在worker端添加了任务的start,complete和fail回调,可以在里面做点事情,代码片段:

$worker->attachCallback ('job_start', Net_Gearman_Worker::JOB_START);    $worker->attachCallback ('job_complete', Net_Gearman_Worker::JOB_COMPLETE);    $worker->attachCallback ('job_fail', Net_Gearman_Worker::JOB_FAIL);

例子8:
是一个大综合,主要有以下几点值得注意:
1. 作者虽然很喜欢php,但也认为让php承担一个daemon的worker不是很保险的事情,可能涉及异常退出啊、内存使用不合理呀什么的,有可能影响性能,所以他提供了一个策略:每个worker有个实例编号,使用文件锁来确保一个实例编号只有一个worker运行,worker在处理了一定数目的job后自动退出,使用crontab任务秒级拉起worker。
2. worker的beginWorker退出可以在monitor回调中判断,monitor回调有这种特性:回调函数返回false则worker继续loop,返回true则loop退出,这个在worker的源码中也得到证实:

if (call_user_func($monitor, $idle, $lastJob) == true) {$working = false;}

$(function () {$(‘pre.prettyprint code’).each(function () { var lines = $(this).text().split(‘\n’).length; var $numbering = $(”).addClass(‘pre-numbering’).hide(); $(this).addClass(‘has-numbering’).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('').text(i)); }; $numbering.fadeIn(1700);}); });

以上就介绍了gearman-php的Net_Gearman库学习,包括了方面的内容,希望对PHP教学有兴趣的朋友有所帮助。


gearman-php的Net_Gearman库学习
  • crontab执行后台任务如何避免全表扫描
  • crontab执行后台任务如何避免全表扫描 | crontab执行后台任务如何避免全表扫描 ...

    gearman-php的Net_Gearman库学习
  • 求推荐一本讲PHP编程思想的书!有没有?该如何处理
  • 求推荐一本讲PHP编程思想的书!有没有?该如何处理 | 求推荐一本讲PHP编程思想的书!有没有?该如何处理 ...

    gearman-php的Net_Gearman库学习
  • 关于Php源代码的有关问题!
  • 关于Php源代码的有关问题! | 关于Php源代码的有关问题! ...