微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 一样。

注意:1).0 0 * * * 是crontab的定时表达式,表示每天的0点0分执行该文件,具体详情可以访问《crontab定时写法》进行学习。          2).可以使用crontab -l 的命令查看已登录的账户有几个定时器。          3).可以到 /var/log/cron 文件查看日志文件,便于追踪错误。 还有一种方法就是写sh脚本执行,但是个人认为用不着写sh脚本     参考:https://www.cnblogs.com/seizemiss/p/9467558.html 
这个根据window和Linux系统不一样,定时任务设置方法也不同,可以自行百度,我用的是本地的windows服务,详情看百度经验:Windows计划任务设置,定时执行指定脚本

有问题
可以私信me,要大胆去尝试哈。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐