主页 >> PHP > PHP定时任务全量同步开发方案

2015/01/18 | 星期日 分类:PHP | 没有评论 标签: , | 作者: | 2,179 views

PHP定时任务全量同步开发方案

最近开发了几个定时任务,全量同步个人基本信息(Oracle数据同步到MySql),浏览量延迟更新,每日订阅邮件发送,年度统计报表汇总等开发任务,万变不离其宗,几乎一样的业务逻辑,完成任务开发工作。

定时任务有“串行”,“并行”执行,即所谓的单线程与多线程,本文就介绍一种串行的任务开发成多线程执行方法,时间超短的关键场景串行执行,到数据处理(耗时大)并行执行方案,这就好比电脑、手机CPU多核的缘故,瞬间“高大上”。

定时任务使用场景有哪些呢?.seedpaddy.com
系统版本升级,业务数据结构改动,有时不可避免的需要刷相应的全量数据;不同系统之间数据全量同步,比如用户信息全量同步;报表统计,比如年度统计报表等等;

定时任务尽量满足如下条件:

  1. 可单个执行(单数据调试,同步);
  2. 分时、分段执行(避免执行超时或内存溢出);
  3. 可多线程执行(数据量大提高执行效率,避免几天没法完成刷数据或全量同步);
  4. 可重复执行(这个非必须)。

看业务流程图:
timer-corntab

图解,定时任务进程启动,设置Memcache锁,到解除Memcache锁,这一步操作是串行执行,主要耗时在取数据阶段(此时定时任务,对大数据量操作尽量SQL简单,带索引查询哦,减少串行阻塞);只要Memcache没锁,任务往下执行。

有了内存锁,为啥还要文件锁?当任务并发来时,程序就会异常,此时定时任务满足条件4就不影响,否则增加一个文件锁,程序会更加严谨(定时任务可控性,建议多个进程跑时,尽量错开运行)。.seedpaddy.com

为啥有标志位?标志位其实就是为了顺序取数据,或者判断定时任务跑了一个全量,是否循环继续跑定时任务,比如全量同步个人信息,取数据阶段若没取到数据,则可以设置标志位为复位(一般设为0即可)。

解除Memcache锁定后,就到了定时任务的核心(数据处理),此处根据业务需求,酌情开发,不再另阐述。

文章中使用到的知识点:Memcache锁,文件锁请参考另外一篇博客:
PHP文件锁核心类库与Flock锁函数

2015年1月27日,优化版流程图:
timer-corntab-better

  • 本文目前尚无任何评论.
    1. 本文目前尚无任何 trackbacks 和 pingbacks.