最近工作做的多是活动相关的,活动的上架下架过期等需要定时执行任务来做,总结了下开发流程(流程很重要,和负责人讨论了很久还是没整理清楚,在纸上画一个流程图就清晰多了,这也是我的习惯),如下:
第一步:
活动添加成功后的代码
// 定时执行任务--拼接 执行任务的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张表,一张是记录成功执行的表,一张是记录失败执行的表(这里就不帖上去了)
写的比较乱,还希望多看看流程图,希望大家多指点