大型分布式网站之计划任务

最近工作做的多是活动相关的,活动的上架下架过期等需要定时执行任务来做,总结了下开发流程(流程很重要,和负责人讨论了很久还是没整理清楚,在纸上画一个流程图就清晰多了,这也是我的习惯),如下:



 

第一步:

活动添加成功后的代码

// 定时执行任务--拼接 执行任务的url (我的api下的Mq类的checkActivityTime方法,该方法是判断当前时间和活动时间比较是否过期)

$url = 'http://'.$_SERVER['SERVER_NAME'].'/Api-Mq-checkActivityTime-vcid-'.$id;

// 调取公共执行方法(期望执行时间)

$request_time = isset($_REQUEST['end_time']) ? strtotime($_REQUEST['end_time']) : '';

BM("Mq")->curlMqUrl($url,$request_time); // 这里请求代码封装了(代码在下面)

// *****************请求封装  start**************

第二步:请求封装的代码如下:

/**

 +------------------------------------------------------------------------------

 * 定时任务

 +------------------------------------------------------------------------------

 * $Author: haibo $

 * $Revision: 83 $ 

 +------------------------------------------------------------------------------

 */

class Mq{

    //  执行mq定时任务的url

        // 类Mq的index作用(代码如下)是将拼接的url入数据库 方便python读取调用

const MQPOST_URL       ='http://xxx.cn/api/?method=mq.index';

 /*

  * 活动添加后 定时执行(活动到期判断)

 * 2016/4/25

 * By haibo_chen

 */

 public function curlMqUrl($paramurl,$endtime){

 $url = self::MQPOST_URL;

 $params['url'] = $paramurl;

 $params['request_time'] = $endtime;

 $result = $this->apiPostData($params,$url);

 if($result){

 return $result;

 }else{

 $this->mqCircleThree($paramurl);  // 执行失败,继续请求2次

 }

 }

 /*

  *定时执行失败  再次请求2次(加之前一次 共计3次)

 * 2016/4/25

 * By haibo_chen

 */

 private function mqCircleThree($paramurl){

 for($i=1;$i<=2;$i++){

 $url = self::MQPOST_URL;

 $params['url'] = $paramurl;

 $this->apiPostData($params,$url);

 }

 }

 /*

  * post接受api接口

 * haibo

 * @param  string  $params json参数

 *

 */

 public function apiPostData($params,$url)

 {

 $post_url = $url;

 $ch = curl_init();

 curl_setopt($ch, CURLOPT_URL, $post_url);

 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

 curl_setopt($ch, CURLOPT_POST, true);

 curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

 $response = curl_exec($ch);

 return json_decode($response,true);

 }

}

// ****************请求封装  end******************

第三步:将请求数据入库

// +++++++++++定时执行的即将请求链接数据入库 -接口 start++++++++++

http://xxx.cn/api/?method=mq.index'

class MqAction extends BaseAction{

public function index() {

$request_time = microtime(true);

//$_POST['url'] = 'http://xxxxx.cn/?g=admin&m=activity&a=check_activitypassed&actid=12';

$url = $_POST['url'];

// 接收插入数据

if(!trim($url)) {

$this->response(array(),201,'请求链接不能为空!');

}

// 请求数据 入库

$data['request_url']  = trim($url);

$data['request_time'] = $_POST['request_time'];

$data['create_time']   = time();

$result = D("timinglog")->add($data);

        if($result) {

            $this->response(array(),200,'记录入库成功');

        }else{

            $this->response(array(),203,'记录入库失败');

        }

}

}



 

//+++++++++++end++++++++++++

第四步:编写参数链接里的方法checkActivityTime(判断是否过期)

/*

     * 定时执行任务url方法(判断众筹/服务 是否过期/有效)

    * 2016/5/11

    * By haibo_chen

    */

    public function checkActivityTime(){

    $vcid = isset($_GET['vcid']) ? intval($_GET['vcid']) : '';

    if(!$vcid){

    echo 'fail';exit;

    }

    $map['vc_id'] = $vcid;

    $venueinfo = M("venue_crowd")->where($map)->find();

    if($venueinfo['end_time'] < time()){ // 过期

    $data['status'] = 3;  // 0进行中   1已成功   2已满   3已结束

    $result = D("venue_crowd")->where(array("vc_id" => $vcid))->save($data);

    if($result){

    echo 'success';exit;

    }else{

    echo 'fail';exit;

    }

    }

    }

// 第五步就交给python了

其实还需要再建立2张表,一张是记录成功执行的表,一张是记录失败执行的表(这里就不帖上去了)

写的比较乱,还希望多看看流程图,希望大家多指点

猜你喜欢

转载自chenhaibo0806999.iteye.com/blog/2297563