计划任务

version

计划任务是一项使系统在规定时间自动执行某些特定任务的功能,合理设置执行时间,能有效地为服务器减轻负担。触发任务除系统指定的时间外,用户行为也可触发。

使用

1.创建计划任务:在 app/Application/Cron/CronScript/ 目录下,新建计划任务文件

样例:

  1. <?php
  2. namespace Cron\CronScript;
  3. use Cron\Base\Cron;
  4. class Demo extends Cron {
  5. //任务主体
  6. public function run($cronId) {
  7. \Think\Log::record("我执行了计划任务事例 Demo.class.php!");
  8. }
  9. }

2.在计划任务管理页面注册计划任务

图片

3.访问 http://网站地址/index.php?g=Cron&m=Index&a=index 即可触发执行计划任务

环境部署

想要执行计划任务,需要一个触发媒介

1.独立主机

独立主机用户可以在系统增加计划任务间隔1分钟执行访问 http://example.com/index.php?g=Cron&m=Index&a=index&cron_secret_key=ztbcms

  • Linux 下,添加 crontab 任务
  1. # 借用 curl 来发起 http 请求
  2. * * * * * curl 'http://网站地址/index.php?g=Cron&m=Index&a=index&cron_secret_key=ztbcms'
  3. # 以 CLI 模式启动运行
  4. * * * * * php /你的应用根目录/index.php /Cron/Index/index/cron_secret_key/ztbcms

参考:Cron表达式生成器

  • Windows 使用计划任务

Windows 没有默认安装Curl, Wget 等工具,你可以选择安装,并模仿linux上的调用写在bat脚本上即可。但是为了更具跨平台,可以参考下面的例子:

1.首先编写一个发送HTTP请求的 cron.php (注意修改网站地址):

  1. <?php
  2. class Curl {
  3. public $headers;
  4. public $user_agent;
  5. public $compression;
  6. public $proxy;
  7. function __construct($compression = 'gzip', $proxy = '') {
  8. $this->headers[] = 'Connection: Keep-Alive';
  9. $this->headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';
  10. $this->user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)';
  11. $this->compression = $compression;
  12. $this->proxy = $proxy;
  13. }
  14. function get($url) {
  15. $process = curl_init($url);
  16. curl_setopt($process, CURLOPT_HTTPHEADER, $this->headers);
  17. curl_setopt($process, CURLOPT_HEADER, 0);
  18. curl_setopt($process, CURLOPT_USERAGENT, $this->user_agent);
  19. curl_setopt($process, CURLOPT_ENCODING, $this->compression);
  20. curl_setopt($process, CURLOPT_TIMEOUT, 10); //超时时间 10秒即可
  21. if ($this->proxy) {
  22. curl_setopt($process, CURLOPT_PROXY, $this->proxy);
  23. }
  24. curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
  25. curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
  26. $return = curl_exec($process);
  27. curl_close($process);
  28. return $return;
  29. }
  30. }
  31. $curl = new Curl();
  32. $curl->get('http://网站地址/index.php?g=Cron&m=Index&a=index&cron_secret_key=ztbcms');

2.编写bat脚本

  1. php {你的项目路径}\cron.php

注意: 需要把 php.exe 的路径放到环境变量

3.创建计划任务(控制面板->管理工具->计划任务),运行bat

参考:百度百科-如何使用windows的计划任务?

2.虚拟主机用户

虚拟主机用户,需要在网站模板中最底部增加一个js调用:

  1. <script type="text/javascript" src="http://网站地址/index.php?g=Cron&m=Index&a=index&cron_secret_key=ztbcms"></script>

最佳实战

1. 更安全的触发计划任务

由于触发定时任务的入口链接是固定的,暴露出去容易被恶意攻击。因此提供了可配置的CRON_SECRET_KEY私钥,请求计划任务入口链接的时带上私钥即可!

Application/Cron/Conf/config.php:

  1. return array(
  2. 'CRON_SECRET_KEY' => 'ztbcms' //计划任务私钥,随机字符串即可,不含空格,等号`=`,问号`?`,或号`&`,示例:ztbcms
  3. );

触发执行计划任务入口改为:http://网站地址/index.php?g=Cron&m=Index&a=index&cron_secret_key=ztbcms

2. 计划任务执行日志

开启记录计划任务执行日志,有助于监控计划任务的执行情况,如单个任务的执行时长,太长的计划可以作进一步优化

Cron/Conf/config.php

  1. return array(
  2. 'CRON_LOG' => true, //开启计划任务日志,默认开启
  3. 'CRON_SCHEDULING_LOG' => true //是否开启计划任务调度运行日志
  4. );

3. 添加『 Cron\CronScript\DeleteCronLog - 删除计划任务日志』计划任务

定期(默认每30日, 根据自己需求调整)删除计划任务日志,减少大量的日志带来的空间压力。计划任务 DeleteCronLog 建议每日凌晨时间执行一次即可。