秒级别的定时任务[多版本]

为什么要定时任务

服务器每天会产生大量的日志数据,定期整理这些数据是一个好的习惯;数据库的信息有的时候也在不停的变化,然而有部分数据需要提前进行缓存,可能是缓存到内存,也可能是进行数据分发。定时任务帮助执行这些本来是人应该做的工作。

在UNIX下,crontab可以满足多数的需求,然而对于股票等行业,在某些时段,crontab提供满足分钟为颗粒的需求,对于秒级别的需求望尘莫及。自己写一个脚本是一个选择,当然如果了解你要做的事的话,那么可能是最优的选择。

独立版

使用一个独立程序来建立定时任务,将帮助你解决不少问题。以下是一个实例:

#!/usr/bin/env php <?php /** 定时任务[独立代码版] * * 独立代码版本表示代码是独立的 * @author monkee */ $frequence = 10; //更新频率,每×秒执行一次 while(1){ $start_time = microtime(TRUE); //do something $end_time = microtime(TRUE); sleep(intval($frequence - ($endtime - $start_time))); } ?>

 利用while(1)来无限循环执行。每一次执行,计算运行的时间,然后利用sleep来进行时间限制。 

问题

现在,程序的执行时间不可能是刚好整数秒数,另外,如果程序中途突发错误使得代码中断,那么你的计划任务就失效。

当然,如果代码能够保证处理掉所有的错误,并且对时间要求允许有1秒的误差,那么上面的代码可以是一种方案。

多进程版本[自身进程]

现在我们针对上面的问题,进行多进程改良。

一个文件里包含:守护逻辑+执行逻辑,我们这里称之为自身进程。

#!/usr/bin/env php <?php /** * 定时任务[多进程版] * * 多进程版表示利用UNIX环境下多进程来执行代码 * @author monkee */ /** * 你的定义的部分 */ $frequence = 10; //更新频率,每×秒执行一次 while(1){ if($pid = pcntl_fork()){ sleep($frequence); }else{ action_process(); break; } } function action_process(){ //do something } ?>
利用pcntl_fork()来产生自身的子进程。这个函数将在新进程中执行自身代码,子进程调用此函数时将得到false。

问题

是的,它也有些问题。一方面,它只能在*nix环境下运行。另一方面,如果需要执行的代码很大,业务逻辑需要处理得很多的时候,你需要将大堆的代码放在一个文件中,这并不是一件让人愉悦的事。(当然,你可以在执行代码部分来引入文件)

多进程版[守护进程]

听起来让人纠结,用起来却还真不错。

单独将守护进程和执行进程分开,这样资源也不会出现堵塞。

#!/usr/bin/env php <?php /** * 定时任务[多进程版] * * 多进程版表示利用UNIX环境下多进程来执行代码 * @author monkee */ /** * 你的定义的部分 */ $frequence = 10; //更新频率,每×秒执行一次 while(1){ pcntl_exec('./action_process.php'); sleep($frequence); } ?>
以上是守护进程代码,将:./action_process.php换作执行代码即可。

其它因素

以上只是解决了定时任务的“时间问题”,一个完整的任务程序自然少不了

1. 执行日志

2. 崩溃记录

3. 垃圾清理[单进程]

4. 多子进程情况


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值