gearman 任务分发系统PHP版应用

别说谁变了你拦得住时间么 提交于 2020-04-10 14:48:07

1 安装gearman

2 启动gearman

3 安装php5.6和PHP的gearman扩展

    apt-get install php5.6-fpm

    安装php扩展用pecl进行安装

     apt-get install php5.6-dev  php5.6-common

      pecl install gearman

4 编写应用

work.php

<?php
//创建一个worker
$worker   =  new   GearmanWorker();
//添加一个job服务
$worker ->addServer( '127.0.0.1' , 4730);
//注册一个回调函数,用于业务处理
$worker ->addFunction( 'sum' ,  function ( $job ) {
     //workload()获取客户端发送来的序列化数据
     $data   = unserialize( $job ->workload());
 
     return   $data [0] +  $data [1];
});
 
//死循环
while (true) {
     //等待job提交的任务
     $ret   =  $worker ->work();
     if   ( $worker ->returnCode() != GEARMAN_SUCCESS) {
         break ;
     }
}

 

编写client.php

<?php
//创建一个客户端
$client   =  new   GearmanClient();
//添加一个job服务
$client ->addServer( '127.0.0.1' , 4730);
//doNormal是同步的,等待worker处理完成返回结果
//建议不要使用do()了
$ret   =  $client ->doNormal( 'sum' , serialize( array (10, 10)));
 
if ( $ret ) {
     echo   '计算结果:' ,  $ret ,  "\n" ;
}

先启动work.php

 

应用多任务

work.php

 

<?php
//创建一个worker
$worker   =  new   GearmanWorker();
//添加一个job服务
$worker ->addServer( '127.0.0.1' , 4730);
//注册一个回调函数,用于业务处理
$worker ->addFunction( 'sendEmail' ,  function ( $job ) {
     //workload()获取客户端发送来的序列化数据
     $data   = json_decode( $job ->workload(), true);
     //模拟发送邮件所用时间
     sleep(6);
     echo   "发送{$data['email']}邮件成功\n" ;
});
 
//死循环
//等待job提交的任务
while ( $worker ->work());  

 

 

client.php

 

<?php
//创建一个客户端
$client   =  new   GearmanClient();
//添加一个job服务
$client ->addServer( '127.0.0.1' , 4730);
//doBackground异步,返回提交任务的句柄
$ret   =  $client ->doBackground( 'sendEmail' , json_encode( array (
     'email'   =>  'test@qq.com' ,
     'title'   =>  '测试异步' ,
     'body'   =>  '异步执行好牛B的样子' ,
)));
 
//继续执行下面的代码
echo   "我的内心毫无波动,甚至还想笑\n" ;
 
do   {
     sleep(1);
 
     //获取任务句柄的状态
     //jobStatus返回的是一个数组
     //第一个,表示工作是否已经知道
     //第二个,工作是否在运行
     //第三和第四,分别对应完成百分比的分子与分母
     $status   =  $client ->jobStatus( $ret );
     
     echo   "完成情况:{$status[2]}/{$status[3]}\n" ;
 
     if (! $status [1]) {
         break ;
     }
}  while (true);

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!