首先得明白,这个计划任务是靠用户每一次访问网站来触发的,所以不能用它做一些精确定时任务。但如果你只是需要系统周期性的做某件事,那还是很好用的。如果需要精确的定时任务,请使用`crontab`来做,但这与`YFCMF`系统无关,自行百度吧。
但`YFCMF`并未把它做成后台可管理的功能,只是用它做了一个定期清理日志的功能,所以我们得手动写代码。
### 需求
假设,我们这个系统是一个`域名销售管理系统`,有很多用户在上面购买了域名。域名有效期一般是按年为单位,所以用户注册域名后时间一长,就容易忘记续费。我们要做的就是每24个小时检查一下即将到期的域名,并给域名所有者发送提醒邮件。由于这个需求不需要精确的时间为前提,所以可以使用系统的计划任务功能。
### 编码
* 先在`/app/cron/`目录下创建一个文件`check-expire-domain.php`,在里面写我们要做的事
~~~
<?php
// 这里本应写一个发布检测域名队列任务的
// 但为了演示效果,只是向系统日志中写一条信息
trace('给域名即将到期的用户发送提醒邮件: ' . date('Y-m-d H:i:s'), 'crons');
~~~
* 打开文件`/app/crons.php`,以数组方式添加一条计划任务
~~~
<?php
// 定时任务 '任务名'=>[任务文件名,定时执行周期,开始执行时间]
return [
// // 定时清理日志
'clearlog' => ['clearlog',86400,1482606000],
// 每24小时检测一下还有3个月就到期的域名
'check_expire_domain' => ['check-expire-domain', 3600*24, 1482606000],
];
~~~
`任务名`:可以随便起,不重复就行;
`任务文件名`:上面创建的那个要执行的文件名,不含后缀;
`定时执行周期`:多久执行一次(秒为单位)(测试时可以把这里改下一点,比如10秒,20秒);
`开始执行时间`:Unix时间戳,大于现在时间,则可以指定哪一天之后开始执行,如果小于现在时间,则立即执行。
* 手动删除`/data/runtime/~crons.php`这个计划任务缓存文件
* 我们随便访问一下网站的任何页面,然后通过后台首页里的`查看日志`可以看到计划任务否执行了
![](https://box.kancloud.cn/c3e5a74a7432a897209f26ea7104d87c_755x180.png)