Thinkphp5 主动式 计划任务 支持windows和linux

4 篇文章 0 订阅

之前发布过一篇文章,说过这个tp5框架的命令行功能和实现计划任务的可能性。但是那篇文章只是提供了一个思路,还没有真正实现计划任务。今天有空终于把这个功能实现了。

百度搜索过相关的php计划任务的资料,特别是搜索thinkphp的计划任务,目前能明确实现的都是被动式的,就是通过tp3.2自带的计划任务类实现,通过挂钩子的形式,用户访问网站的时候就执行计划任务,这种不是我们需要,我们需要的是全自动,而且配置方便的。在GitHub上搜索的php计划任务有点脱离的tp5框架,如果用的话,需要加载tp5的底层类才行。

我实现的方法就是利用tp5命令行的功能,它能加载底层而且可以让框架在命令行上运行,这样最后部署的时候都可以很容易适应windows和linux,另外一个就是引用了linux的crontab思想,我把配置都放到同一个项目文件下面,这样就不需要为每一个计划任务去设置系统计划配置了。

好了,上代码的时候了。因为能力有限,暂时不能为大家做一个composer的包。

第一步:设置计划任务的配置

在application\config.php下面添加这个配置,熟悉crontab的朋友就觉得这个格式是不是很像。

[php]  view plain  copy
  1. /*每分钟*/  
  2.     /*每小时 某分*/  
  3.     /*每天 某时:某分*/  
  4.     /*每周-某天 某时:某分  0=周日*/  
  5.     /*每月-某天 某时:某分*/  
  6.     /*某月-某日 某时-某分*/  
  7.     /*某年-某月-某日 某时-某分*/  
  8.     'sys_crond_timer' => array('*''*:i''H:i''@-w H:i''*-d H:i''m-d H:i''Y-m-d H:i'),  

第二步:计划任务的核心代码。这一步已经帮大家实现了,大家需要理解的就是tp5的命令行实现就可以。在application\common\lib下面创建Crond.php文件。复制下面代码

[php]  view plain  copy
  1. <?php  
  2. /** 
  3.  * Created by PhpStorm. 
  4.  * Date: 2016/10/17 
  5.  * Time: 16:27 
  6.  * User: 潘国兴 
  7.  * Email: denispan@outlook.com 
  8.  */  
  9.   
  10. namespace app\common\lib;  
  11.   
  12. use think\Config;  
  13. use think\console\Command;  
  14. use think\console\Input;  
  15. use think\console\Output;  
  16.   
  17. class Crond extends Command  
  18. {  
  19.     protected function configure()  
  20.     {  
  21.         $this->setName('Cron')  
  22.              ->setDescription('计划任务');  
  23.     }  
  24.   
  25.     protected function execute(Input $input, Output $output)  
  26.     {  
  27.         $this->doCron();  
  28.         $output->writeln("已经执行计划任务");  
  29.     }  
  30.   
  31.     public function doCron()  
  32.     {  
  33.         // 记录开始运行的时间  
  34.         $GLOBALS['_beginTime'] = microtime(TRUE);  
  35.   
  36.         /* 永不超时 */  
  37.         ini_set('max_execution_time', 0);  
  38.         $time   = time();  
  39.         $exe_method = [];  
  40.         $crond_list = Config::get('crond');   //获取第四步的文件配置,根据自己版本调整一下  
  41.         $sys_crond_timer = Config::get('sys_crond_timer');  
  42.         foreach ( $sys_crond_timer as $format )  
  43.         {  
  44.             $key = date($formatceil($time));  
  45.   
  46.             if ( is_array(@$crond_list[$key]) )  
  47.             {  
  48.                 $exe_method = array_merge($exe_method$crond_list[$key]);  
  49.             }  
  50.         }  
  51.   
  52.   
  53.         if (!empty($exe_method))  
  54.         {  
  55.             foreach ($exe_method as $method)  
  56.             {  
  57.                 if(!is_callable($method))  
  58.                 {  
  59.                     //方法不存在的话就跳过不执行  
  60.                     continue;  
  61.                 }  
  62.   
  63.                 echo "执行crond --- {$method}()\n";  
  64.                 $runtime_start = microtime(true);  
  65.   
  66.                 call_user_func($method);  
  67.   
  68.                 $runtime = microtime(true) - $runtime_start;  
  69.   
  70.                 echo "{$method}(), 执行时间: {$runtime}\n\n";  
  71.             }  
  72.   
  73.             $time_total = microtime(true) - $GLOBALS['_beginTime'];  
  74.             echo "total:{$time_total}\n";  
  75.         }  
  76.     }  
  77. }  

第三步:配置命令行

在application\command.php 添加一行。注意这个命名空间,包括上面的文件也是。如果你部署的文件夹和我不一样,需要调整一下。

[php]  view plain  copy
  1. 'app\common\lib\Crond'  

第四步: 配置计划任务配置文件

这一步需要大家注意,由于这个属于tp5配置文件,tp5.0 和 tp5.01之后的配置文件存放位置不一样,大家根据自己版本调整。在application\extra\crond.php文件中

[php]  view plain  copy
  1. <?php  
  2. /** 
  3.  * Created by PhpStorm. 
  4.  * Date: 2016/10/17 
  5.  * Time: 16:53 
  6.  * User: 潘国兴 
  7.  * Email: denispan@outlook.com 
  8.  * 计划任务的配置表 
  9.  */  
  10.   
  11. $crond_list = array(  
  12.     '*' => [  
  13.         'app\command\Test::firstTest'  
  14.     ],  //每分钟  
  15.   
  16.     '00:00'      => [],  //每周 ------------  
  17.     '*-01 00:00' => [],  //每月--------  
  18.     '*:00'       => [],  //每小时---------  
  19.   
  20. );  
  21.   
  22. return $crond_list;  

这个配置文件跟第一步配置相关联的,配置的是某个具体的类和方法,主要一点要指定具体的命名空间和方法名,建议用静态方法,省去new对象,节省资源。方法名不要带(),否则执行不成功。

计划任务的执行命令行:cmd 打开到项目根目录

[php]  view plain  copy
  1. </pre><pre name="code" class="html">php think Cron  

计划任务就这样实现了。最后就是部署到系统的计划任务中。让系统每分钟执行这个命令。

linux下面的crontab配置教程:

先在项目根目录创建一个crond.sh的执行文件,输入下面的内容(加上php程序的目录)

[plain]  view plain  copy
  1. #!/bin/sh  
[plain]  view plain  copy
  1. PATH=/usr/local/php/bin:/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  
  2. cd /htdocs/baiben/www/  
  3. php think Cron  
开放执行权限:chmond u+x crond.sh

然后运行下面的教程,配置计划任务:

命令行:crontab -e  

然后再界面输入:*/1 * * * * bash 你的目录/crond.sh

保存退出

然后重启crond:

命令:service crond restart

完成。

文章来源:https://blog.csdn.net/panxiong91/article/details/52841593

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值