`
275553385
  • 浏览: 706302 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
文章分类
社区版块
存档分类
最新评论

ecstore定时任务

阅读更多

ecstore crontab配置

  1. 默认的实现机制
    Ecstore是通过js每30秒调用定时分配脚本,但这个仅限于网店后台登陆状态下。
    
  2. 改善方案
    通过操作系统层面的crontab定时去调用Ecstore本身的定时分配机制
    
  3. 实现步骤
  • 关闭原系统调用机制

    在config.php中添加如下代码

    define('SYSTEM_CRONTAB',true);
    
  • 通过服务器上[crontab http://crontab.org/ ]定时调用crontab [http://wiki.dreamhost.com/Crontab ]定时任务的添加,首先执行如下命令
    crontab -e
    
    接着在打开的文件中输入如下代码:
    */5 * * * *  "项目目录"/app/base/cmd crontab &
    * * * * * "项目目录"/app/base/cmd base:queue flush  &
    
    注意:php的路径如果不是 ”/usr/bin/php “,  “项目目录”前面必须加上php的执行文件目录
    
    
    提示:
    以上的代码所表述的内容是:每5分钟调用一次分配脚本
    建议crontab 每5分钟调用一次,如果数据量比较大,可以放在凌晨调用脚本
    例如:每天凌晨0点到4点每30分钟调用一次脚本,代码如下
    30 0-4 * * * /data/www/ecstore/src/app/base/cmd crontab &
    * * * * * /data/httpd/app/base/cmd base:queue flush  &
    
    最后保存,并输入以下命令重启cron
    service crond restart
分享到:
评论
1 楼 275553385 2013-12-26  
   大访问量下,session数据会大量产生。使用ecstore本身自带的清除命令:kvdelexpires + linux crontab 能够起到清除kvstore垃圾数据的作用。但是会造成数据库压力增加,下面我们会提供一个更为优化的替换方案。
   风险提示:该方案可能造成的问题:
    1、优化实施过程中会造成用户登陆失效、加入购物车失效等与session相关的问题。(所以建议该方案要么在网站无访问过程中实施,要么直接将网站挂出“网站正在维护中”的状态再做优化。)
    2、由于该方案涉及ecstore运行所依赖的kvstore数据,虽然我们对该方案做了测试,但是还是强烈建议做该优化前对整站备份(代码+数据库)
   该方案思路:
     删除sessions数据,然后给mongodb数据库加入字段: expire 用于计算sessions和其他kvstore数据的过期时间(需要执行kvrecovery将该字段加入mongodb库中)。对kvdelexpires进行改造,放弃原先需要遍历mysql中base_kvstore表的思路。直接对比mongodb中expire字段的过期时间删除mongodb中的过期kvstore数据。
  下面我们来看具体实施步骤:
  1、步骤一(删除所有session数据,可能造成用户掉线,建议无访问时执行):
    mysql:
    delete from sdb_base_kvstore where prefix='sessions';
    mongodb:
    use ecos  //换成自己使用的库名称
    db.defalut.remove({prefix:'sessions'})
  2、步骤二(修改文件,主要是针对mongodb增加了expire字段、同时修改了过期数据清理机制)
    app/base/lib/kvstore.php:
    static public function delete_expire_data()
    {
        $time = time();
        $kv_obj = base_kvstore::instance()->get_controller('');
         if(method_exists($kv_obj, 'delete_expire_data'))
            $kv_obj->delete_expire_data();
         kernel::database()->exec('DELETE FROM sdb_base_kvstore WHERE ttl>0 AND (dateline+ttl)<'.$time, true);
    }
     app/base/lib/kvstore/mongodb.php:
    //替换原有函数
    public function store($key, $value, $ttl=0)
    {
       $store['value'] = $value; $store['dateline'] = time();
       $store['ttl'] = $ttl; $store['key'] = $this->create_key($key);
       $store['prefix'] = $this->prefix;
       $store['expire'] = $store['dateline'] + $store['ttl'];  //增加字段
       $res = self::$_mongodb->update(array('key'=>$store['key']), $store, array("upsert" => true));
       return $res;
     }//End Function

    //替换原有函数
    public function recovery($record)
    {
        $key = $record['key'];
        $store['key'] = $this->create_key($key);
        $store['value'] = $record['value'];
        $store['dateline'] = $record['dateline'];
        $store['ttl'] = $record['ttl'];
        $store['expire'] = $store['dateline'] + $store['ttl']; //增加字段
        $res = self::$_mongodb->update(array('key'=>$store['key']), $store, array("upsert" => true));
        return $res;
    }//End Function

    //新增函数
    public function delete_expire_data()
    {
        return self::$_mongodb->remove(array('expire'=>array('$lt'=>time())));
    }
  3、步骤三(将mysql中的数据重新同步到mongodb,同时增加了expire字段):
      [ecstore_path]/app/base/cmd kvrecovery

  4、步骤四(增加索引):
    mysql :
    create index ind_ttl using btree on sdb_base_kvstore(ttl);
    mongo:
    db.defalut.ensureIndex({expire:1})
  5、重新将kvdelexpires加入crontab
     00 5 * * * [ecstore_path]/app/base/cmd kvdelexpires &

相关推荐

Global site tag (gtag.js) - Google Analytics