做为电商网站,每天都有大量的数据进行操作;其中很多操作需要通过Linux下Crontab进行执行,例如:订单状态变更、发送邮件和短信、批量发送优惠券、清理历史日志数据等,ShopNc有专门的定时任务Crontab模块。通过ssh连接Linux服务器,输入crontab -e 编辑计划任务:
crontab -e # B2B2C商城 Linux下定时任务设置示例 # php安装路径 /usr/local/php # 商城安装路径 /wwwroot # 执行频率:10分钟,[更新商品促销状态、首页商品信息、邮件通知等] */10 * * * * /usr/local/php/bin/php /wwwroot/crontab/index.php minutes # 执行频率:1小时,[更新全文索引] 0 */1 * * * /usr/local/php/bin/php /wwwroot/crontab/index.php hour # 执行频率:1天,[订单超期自动处理、售后超时处理、代金券虚拟码等过期提醒、更新统计等] 0 3 * * * /usr/local/php/bin/php /wwwroot/crontab/index.php date # 执行频率:1个月,[生成结算] 0 4 1 * * /usr/local/php/bin/php /wwwroot/crontab/index.php month
这样就实现了ShopNc计划任务的部署,如果有特定的计划任务,可以添加新的控制器,例如Sap数据同步在每天凌晨2点进行执行:
1.在ShopNc/crontab/control/目录下创建sap.php,主要实现sap数据同步的业务:
crontab -e //sap数据同步,每天凌晨2点执行 0 2 * * * /usr/local/php/bin/php /wwwroot/crontab/index.php sap
2. 关于执行大数量批量操作的注意的问题:
1) 设计死循环模式对数据进行分组处理
对于电商平台,通常要处理大批量的数据,如果通过一条sql语句将所需要处理的数据读取后统一操作,会造成服务器内存的益处。
例如:平台订单表只保存近3个月的订单数据,那么每 个月会在数据库将前3个月的订单数据转移到订单历史表中,如今电商平台3个月的订单基本上都可以超过百万,如果同时处理100万条订单数据肯定会造成服务器内存溢出的,那么我们 需要将近3个月的订单进行分批操作,每次处理10000个订单,这样就能保证服务器的压力,通过死循环的方式来很容易实现分批操作,
/** * 将三个月以前的订单存储到备份表中 */ public function backOrders(){ //截止日期 $endtime = strtotime("-3 month"); $condtions = array('add_time'=> array('lt' , $endtime)); //计算出3个月以前的订单数量 $order_model = Model('orders'); $totals = $order_model->where($condtions)->count(); if($totals<1) return false; $page = 10000;//每次处理10000个订单 $flag = true; //设置死循环标志 while($flag){ //获取数据集 if(empty($end['order_id'])){ $result = $order_model->field('order_id')->where($condtions)->limit($page)->order('order_id ASC'); }else{ $condtions['order_id'] = array('lt' , $end['order_id']); $result = $order_model->field('order_id')->where($condtions)->limit($page)->order('order_id ASC'); } if(count($result) < $page){ //数据全部处理完成,跳出死循环 $flag = false; }elseif(empty($result[0]['order_id'])){ //结果集为空返回 return false; } //获取查询到最后一个order_id $end = end($result); //订单备份的操作 ... }
2) 大数量下sql语句分页的操作:
如上图所示,在进行分批操作的时候,如果分页的数据量大的话随着指针的偏移量增大,查询速度会越来越慢,如果是千万级的数量会严重的影响到数据库查询性能:
上图解决办法是将上一个结果集主键order_id值获取到,然后用在下一个sql语句做为条件where order_id > 上个分页最后的order_id值。这样会大大提高sql查询的速度。
原创文章,作者:管理员,如若转载,请注明出处:http://www.bajiege.com/archives/153.html