定时任务的实现方案

在实际应用开发过程中,我们往往面对类似“每天五点群发消息”这种需求,这种时候就需要设计定时任务。如果你的服务本身常驻内存,这件事情就变得蛮简单了,你只需要分配一个进程,每隔N秒运行一次检查是否需要触发任务。
本文主要探讨非常驻型服务的解决方案(典型的:web脚本语言服务器)。

1. 不借助操作系统工具

1.1 CLI模式

以php语言为例,php的运行模式一般是响应式的:收到请求->返回数据。为了达到常驻的目的,我们需要构造一个死循环。这种代码很适合运行在CLI模式下,能够及时把反馈打印到屏幕,观察运行状态。

where(1){
    works();   //你的任务
    sleep(5);  //CPU休息一下
}

1.2 Web环境

如果你希望这段代码正常运行在web环境下,还需要一点点小功课

    ignore_user_abort(true); //忽略客户端断开,脚本继续运行
    set_time_limit(0); //脚本不会因超时中断
    session_abort(); //退出session,防止文件锁死

这样可以确保你的脚本可以无声无息的一直运行在后台,直到意外错误。
但是又有一个问题:输入输出?web环境下死循环的代码是无法用常规手段输入输出数据的,我们需要一些旁敲侧击的手段。
个人觉得比较简单的思路是:输入输出都通过文件来控制。你可以读取文件来查看输出,也可以往文件写入数据来控制程序的行为。

考虑一下如何设计命令输入?在这种运行方式下想要得到稳定可控制的常驻服务,并不容易。


2. 借助操作系统工具

常用的生产环境系统为linux和windows。借助操作系统自带的计划任务工具,我们也能轻松达到目的。

2.1 Windows服务器的计划任务工具

创建任务时,选择运行脚本,然后你只要编写一个bat文件就可以了。
php.exe -q your_php_code.php

TIM截图20170614165245.png

2.2 Linux服务器的计划任务工具(推荐)

Cron是一个Linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,需要手动开启,也可以让它开机自启动。
有关cron的使用方法本文就不详细展开讨论了。