您好,欢迎访问一九零五行业门户网

gearman-php的Net_Gearman库学习

按照这个英文帖子学习的
原文代码的备份
例子1:
像我们展示了net_geaman的基本架构,client端主要代码:
// 一个client对象,需要jobserver信息,一个数组$client = new net_gearman_client (gm::$servers);// example1就是function name$client->example1 (array ('date'));
worker端主要代码:
// 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;}
以上就介绍了gearman-php的net_gearman库学习,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。
其它类似信息

推荐信息