美文网首页
laravel 调度任务

laravel 调度任务

作者: 一颗地梨子 | 来源:发表于2020-11-18 16:57 被阅读0次

    larave 一直是国内外备受欢迎的框架,功能强大、结构优雅,其中 artisan 命令 也一直备受青睐。接下来就使用 artisan 结合 centOS 的 crontab 功能来实现其调度任务。

    首先进入服务器、编辑 crontab   在终端输入: crontab -e  进入编辑页面。在页面最后输入:

    * * * * * php_path web_path/artisan schedule:run >> /dev/null 2>&1

        * * * * *   每分钟执行

        php_path PHP路径  如果不清楚 可使用: which php  命令获取路径

        web_path web项目路径   进入项目根目录 执行:pwd 命令获取路径

    crontab 基本用法:

        crontab -l    查看当前用户的调度任务

        crontab -e   编辑调度任务

        crontab -r   删除调度任务

        /sbin/service crond start   开启

        /sbin/service crond stop  停止

        /sbin/service crond restart  重启

        /sbin/service crond reload  重新加载

    crontab 不会开机自动启动、所以如果需要还要设置开机自启动:

       在 /etc/rc.d/rc.local  脚本中加入  /sbin/service crond start  即可

    服务器设置完成、接下来在项目中配置

    在终端进入项目根目录、执行  php artisan make:command order  (这里我是项目需要、就直接命名为: order ),此时在项目的:app/Console  下就会多出:  Commands/order.php    Commands 目录回在执行命令的时候自动创建、多以不需要提前创建。

    创建的命令文件

    接下来看看 order.php 文件里有那些配置是需要我们修改的

    修改后的 order.php 文件

    我在业务逻辑区 记录了执行的 日志,一会配置完成后可以测试一下是否已配置成功

    接下来最后一步、我们需要在 app/Console/Kernel.php 文件中加载我们生成的 order 命令 并设置 调用周期

    打开 Kernel.php 进行编辑

    use App\Console\Commands\order; 

    protected $commands = [  order::class  ];

    protected function schedule(Schedule $schedule){

         $schedule->command('order')->everyMinute(); // 没分钟执行一次

    }

    首先在终端执行 php artisan 

    执行 php artisan 可以看到新添加的命令

    这里可以看到我新的 orde 命令及描述(这个中文描述在这里确实有点 不入格调)

    现在配置基本完成、来测试一下配置是否成功: 在终端 项目根目录下面 执行: php artisan order

    终端没有出现报错信息、再查看一下日志文件,发现了我们刚才在 order.php 的 handle() 方法中记录的日志信息,说明我们的命令配置没有问题。接下来我们把服务器的 crontab 服务启动起来,在终端执行:  /sbin/service crond start   再次查看日志文件,可以看到我们的记录每分钟添加一条,说明我们的调度任务已经在每分钟执行了。

    查看定时器执行结果

    如果开启 crontab  服务 发现并没有执行定时器、那我们可以直接在终端执行我们再 crontab 添加的命令、查看结果,即:php_path web_path/artisan schedule:run  可找出失败原因。

    根据我们的业务需求、我们还可以给命令加参数,如: 再 order.php  设置命令时 配置为: order {1}{2}  --  根据实际业务情况 设置参数  实用 php artisan order 参数值  即可

    为了更方便我们实用、laravel 还为我们准备了一些 调用频率设置以及任务钩子等

    方法                                    描述

    ->cron('* * * * *');               在自定义Cron调度上运行任务

    ->everyMinute();               每分钟运行一次任务

    ->everyFiveMinutes();       每五分钟运行一次任务

    ->everyTenMinutes();        每十分钟运行一次任务

    ->everyFifteenMinutes();    每十五分钟运行一次任务

    ->everyThirtyMinutes();      每三十分钟运行一次任务

    ->hourly();                          每小时运行一次任务

    ->hourlyAt(17);                   每小时第十七分钟运行一次任务

    ->daily();                            每天凌晨零点运行任务

    ->dailyAt('13:00');              每天13:00运行任务

    ->twiceDaily(1, 13);           每天1:00 & 13:00运行任务

    ->weekly();                         每周运行一次任务

    ->monthly();                       每月运行一次任务

    ->monthlyOn(4, '15:00');     每月4号15:00运行一次任务

    ->quarterly();                        每个季度运行一次

    ->yearly();                            每年运行一次

    ->timezone('America/New_York');   设置时区

    ->weekdays();                                只在工作日运行任务

    ->sundays();                                   每个星期天运行任务

    ->mondays();                                 每个星期一运行任务

    ->tuesdays();                                 每个星期二运行任务

    ->wednesdays();                           每个星期三运行任务

    ->thursdays();                               每个星期四运行任务

    ->fridays();                                    每个星期五运行任务

    ->saturdays();                               每个星期六运行任务

    ->between($start, $end);              基于特定时间段运行任务

    ->when(Closure);                          基于特定测试运行任务

    between 方法用于限定一天中特定时间段的任务执行: $schedule->command('order')->hourly()->between('7:00', '22:00');

    unlessBetween 方法用于排除指定时间段任务的执行:$schedule->command('order')->hourly()->unlessBetween('23:00', '4:00');

    when 方法用于限制任务基于给定真理测试的结果执行。换句话说,如果给定闭包返回true,只要没有其它约束条件阻止任务运行,该任务就会执行:$schedule->command('order')->daily()->when(function () { return true; });

    skip 方法和 when 相反,如果 skip 方法返回true,调度任务将不会执行:$schedule->command('order')->daily()->skip(function () { return true; });

    避免任务重叠:$schedule->command('order')->withoutOverlapping();  

    还可以指定"without overlapping"锁失效前的分钟数,默认情况下,这个锁会在 24 小时后失效:$schedule->command('order')->withoutOverlapping(10);

    当 Laravel 处于维护时,调度任务不会运行,不过,如果你想要在维护模式期间强制运行任务,可以使用 evenInMaintenanceMode 方法:$schedule->command('order')->evenInMaintenanceMode();

    Laravel 调度器为处理调度任务输出提供了多个方便的方法。首先,使用sendOutputTo 方法,你可以发送输出到文件以便稍后检查:$schedule->command('order')->daily()->sendOutputTo($filePath);   如果想要追加输出到给定文件,可以使用 appendOutputTo 

    钩子:$schedule->command('order')->daily()->before(function () {// 任务即将开始...})->after(function () {// 任务已经完成...});

    使用 pingBefore 和 thenPing方法,调度器可以在任务完成之前和之后自动 ping 给定的 URL。该方法在通知外部服务时很有用,如在调度任务开始或完成的时候   $schedule->command('order')->daily()->pingBefore($url)->thenPing($url);

    相关文章

      网友评论

          本文标题:laravel 调度任务

          本文链接:https://www.haomeiwen.com/subject/wisciktx.html