• 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 appadmincommand;
    
    use thinkconsoleCommand;
    use thinkconsoleInput;
    use thinkconsoleOutput;
    
    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 [
        'appcommandTest'   //加入需要cmd或者linux-crontab执行的PHP文件
     ];

    其中return是个数组,所以你可以存放多个任务文件

    3.运行test命令

    下面开始说一下在Windows中和Linux中分别执行的方法。

    Windows(测试):

        方法一:

    进入到你的TP5项目根目录,cd C:phpstudyPHPTutorialWWWworkproject  当中,执行:

    php think Test
    

    运行php think Test命令test命令execute方法中运行的方法就会运行

     没有报错的话,就会输出在excute中执行代码前后$output输出的内容

        方法二:

    写一个.bat脚本文件:tast.bat文件

    C:
    cd C:phpstudyPHPTutorialWWWworkproject
    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脚本
     
     
    这个根据window和Linux系统不一样,定时任务设置方法也不同,可以自行百度,我用的是本地的windows服务,详情看百度经验:Windows计划任务设置,定时执行指定脚本

    有问题
    可以私信me,要大胆去尝试哈。
  • 相关阅读:
    仿QQ消息弹出框
    WPF,Silverlight与XAML读书笔记第十六 资源之二进制资源
    WPF,Silverlight与XAML读书笔记第十七 资源之逻辑资源
    WPF,Silverlight与XAML读书笔记第十 WPF框架与工作方式介绍
    WPF,Silverlight与XAML读书笔记第五 XAML与传统过程式代码的关系
    再谈ASP.NET第七 跨应用、跨服务器的表单验证
    WPF,Silverlight与XAML读书笔记第六 WPF新概念之一逻辑树与可视树
    WPF,Silverlight与XAML读书笔记第八 WPF新概念之三路由事件
    WPF,Silverlight与XAML读书笔记第十四 独立存储&部署
    WPF,Silverlight与XAML读书笔记第七 WPF新概念之二依赖属性
  • 原文地址:https://www.cnblogs.com/T8888/p/12604182.html
Copyright © 2020-2023  润新知