首先得明白,這個計劃任務是靠用戶每一次訪問網站來觸發的,所以不能用它做一些精確定時任務。但如果你只是需要系統周期性的做某件事,那還是很好用的。如果需要精確的定時任務,請使用`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`這個計劃任務緩存文件
* 我們隨便訪問一下網站的任何頁面,然后通過后臺首頁里的`查看日志`可以看到計劃任務否執行了
