解密ShopNc计划任务机制

做为电商网站,每天都有大量的数据进行操作;其中很多操作需要通过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查询的速度。

原创文章,作者:管理员,如若转载,请注明出处:https://www.bajiege.com/soft/shopnc/shopnc-schedule-task-mechanism.html

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据