Linux && Windows下基于ThinkPHP5框架实现定时任务(TP5定时任务)-结合Crontab任务
最近在项目上利用Tp5开发数据统计的时候碰到了很棘手的问题,数据量太大(上亿数据)的时候可能执行的速率有些慢,加了缓存,阿里云日志…… 虽然效率得到了提高,但是在加载页面的时候总有有一个时间长短不一的等待过程,这个过程可谓是让人最难受,因为等待页面数据刷新出来浪费时间,所以采用了定时任务去跑。
通俗来讲:我采用的方法是Tp5写好定时任务,然后linux-crontab做任务规划,每十分钟执行一次任务,将数据10分钟更新一次并存入Redis缓存中,10分钟后执行的时候就是覆盖更新数据的过程。这样在页面展示的时候直接读取redis中已经存储的数据进行展示就好了。免得再去查询数据库。
采用thinkphp5的command工具和服务器的定时任务来做:
1.在/application/command(如果没有这个文件夹那就新建一个)文件夹中创建要配置的PHP类文件,需要继承Command类,并重写configure和execute两个方法,例如:
/application/command/Test.php
一定要记得extends继承Command
<?php namespace app\admin\command; use think\console\Command; use think\console\Input; use think\console\Output; class Test extends Command {
//配置定时器的信息 protected function configure(){ $this->setName('Test')->setDescription("计划任务Test");
}
protected function execute(Input $input, Output $output){
//输出到日志 $output->writeln('Date Crontab job start...'); /*** 这里写计划任务列表集 START ***/ $this->testWork();
//或者直接写你的代码逻辑,建议封装或者调用方法,在其它方法写好直接调用,简洁干净 /*** 这里写计划任务列表集 END ***/ $output->writeln('Date Crontab job end...'); } private function testWork(){ echo "定时任务testWork"; } }
其中:configure函数是在命令行中用list命令列出所有任务的时候回显示的出的提示,execute函数是说要执行的命令,在这里可以直接调用其他函数,完成例如统计等任务工作,然后用output输出到命令行
configure中的$this->setName(" ")是定义你定时任务的名字。
2.配置/application/command.php(没有自己添加)内容,加入上述的定时器文件
<?php return [ 'app\command\Test' //加入需要cmd或者linux-crontab执行的PHP文件
];
其中return是个数组,所以你可以存放多个任务文件
3.运行test命令
下面开始说一下在Windows中和Linux中分别执行的方法。
Windows(测试):
方法一:
进入到你的TP5项目根目录,cd C:\phpstudy\PHPTutorial\WWW\work\project 当中,执行:
php think Test
运行php think Test命令test命令execute方法中运行的方法就会运行
没有报错的话,就会输出在excute中执行代码前后$output输出的内容
方法二:
写一个.bat脚本文件:tast.bat文件
C: cd C:\phpstudy\PHPTutorial\WWW\work\project php think Test
点击文件自动执行。不过感觉方法二没什么必要,哈哈。
如果要在Windows中写定时的话,请自行百度,可以实现。但是这边在Window只做一个测试,看看我们TP5-command定时任务能否顺利执行。然后再Linux中进行crontab规划任务
Linux:
将项目上线后,进入到项目根目录
php think查询可以被执行的命令,如下:
php think Test
看看能否跑通。没问题继续。
接下来再Linux中设定crontab任务
有两种方式,效果是一样的:
1.连接到服务器,输入 crontab -e,写入:
0 0 * * * php /home/www/pre/app_api/php/sdk/think Test > /dev/null 2>&1
其中红色 think 不是目录,相当于我们在Windows中 php think Test 一样。
这个根据window和Linux系统不一样,定时任务设置方法也不同,可以自行百度,我用的是本地的windows服务,详情看百度经验:Windows计划任务设置,定时执行指定脚本
有问题可以私信me,要大胆去尝试哈。