zoukankan      html  css  js  c++  java
  • Laravel任务调度

    简介
    Cron 是 UNIX、SOLARIS、LINUX 下的一个十分有用的工具,通过 Cron 脚本能使计划任务定期地在系统后台自动运行。这种计划任务在 UNIX、SOLARIS、LINUX下术语为 Cron Jobs。Crontab 则是用来记录在特定时间运行的 Cron 的一个脚本文件,Crontab 文件的每一行均遵守特定的格式:


    我们可以在服务器上通过 crontab -e 来新增或编辑 Cron 条目,通过 crontab -l 查看已存在的 Cron 条目。更多关于 Cron 的原理和使用细节请自行百度或 Google。

    在以前,开发者需要为每一个需要调度的任务编写一个 Cron 条目,这是很让人头疼的事。你的任务调度不在源码控制中,你必须使用 SSH 登录到服务器然后添加这些 Cron 条目。

    Laravel 命令调度器允许你流式而又不失优雅地在 Laravel 中定义命令调度,并且服务器上只需要一个 Cron 条目即可。任务调度定义在 app/Console/Kernel.php 文件的 schedule 方法中,该方法中已经包含了一个示例。

    开启调度器
    下面是你唯一需要添加到服务器的 Cron 条目,如果你不知道如何添加 Cron 条目到服务器,可以考虑使用诸如 Laravel Forge 这样的服务来为管理 Cron 条目:

     * * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

    该 Cron 将会每分钟调用一次 Laravel 命令调度器,当 schedule:run 命令执行后,Laravel 评估你的调度任务并运行到期的任务。

    1 添加Cron到服务器

    crontab -e 进入编辑模式 添加下面的内容:
    
    * * * * * /usr/local/php/bin/php /home/wwwroot/web.laravel.cn/artisan schedule:run >> /dev/null 2>&1
    
    * * * * *  时间
    /usr/local/php/bin/php  : 你自己php的环境     [whereis php]
    /home/wwwroot/web.laravel.cn/artisan    : artsian目录
    schedule:run >> /dev/null 2>&1  : 固定写法

    2 创建文件

    php artisan make:console LogInfo [自定义文件名] 如果报错则运行 php artisan make:command 
    =======================================================================================================================

    在以前, 开发者需要为每一个需要调度的任务编写一个 Cron 条目, 这是很让人头疼的事. 你的任务调度不在源码控制中, 你必须使用 SSH 登录到服务器然后添加这些 Cron 条目. Laravel 命令调度器允许你平滑而又富有表现力地在 Laravel 中定义命令调度, 并且服务器上只需要一个 Cron 条目即可, 任务调度又是我们俗称的 “计划任务”

    任务调度定义在 app/Console/Kernel.php 文件的 schedule 方法中, 该方法中已经包含了一个示例. 你可以自由地添加你需要的调度任务到Schedule 对象

    开启调度

    // 在 linux 环境中执行
    * * * * * root php /var/www/laravel/artisan schedule:run

    /var/www/laravel 为你的项目目录, 该 Cron 将会每分钟调用 Laravel 命令调度, 然后 Laravel 评估你的调度任务并运行到期的任务.

    定义调度
    在 项目根目录 下创建定时任务所需要进行的操作

    创建命令
    php artisan make:console Stat_Test 该操作会在 app/Console/Commands 下生成一个 Stat_Test.php, 以下是小例子

    <?php
     
    namespace App\Console\Commands;
     
    use Illuminate\Console\Command;  
    class Stat_Test extends Command  
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'stat:test';
     
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'stat:test';
     
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
     
        /**
         * Execute the console command.
         *
         * @return mixed
         */
        public function handle()
        {
            $this->addData();
        }
     
        // 例子
        public function addData() {
            $time = time();
            $rand = rand(1, 1000);
            $id = \DB::table('data_test')->insertGetId(['uuid' => $time, 'uuid' => $rand]);
           if ($id) {
              \Log::info('定时/数据插入成功', $id);
           } else {
              \Log::error('定时/数据插入失败', $time);
           }
       }
    }


    值得注意的是 这个文件中的 $signature = 'stat:test' 这个签名在 Kernel.php 中也要相应用到, 下面是附上 Kernel.php 的完整代码

    <?php
     
    namespace App\Console;
     
    use Illuminate\Console\Scheduling\Schedule;  
    use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
     
    class Kernel extends ConsoleKernel  
    {
        /**
         * The Artisan commands provided by your application.
         *
         * @var array
         */
        protected $commands = [
            \App\Console\Commands\Inspire::class,
            '\App\Console\Commands\Stat_Test',
        ];
     
        /**
         * Define the application's command schedule.
         *
         * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
         * @return void
         */
        protected function schedule(Schedule $schedule)
        {
           //  为测试方便 每分钟执行一次
            $schedule->command('stat:test')->everyMinute();
        }
    }

    再强调一次 $schedule->command('stat:test') 里面的 stat:test 必须和上面的签名 $signature = 'stat:test' 对应上

    引入调度文件

    protected $commands = [ 
    \App\Console\Commands\Inspire::class,
    '\App\Console\Commands\Stat_Test',
    ];
    // 每周星期六 11:00 运行一次...
    $schedule->command('stat:test')->weekly()->saturdays()->at('11:00');
    
    // 每周星期一 01:00 运行一次...
    $schedule->command('stat:test')->weekly()->->mondays()->at('01:00');


    调度常用选项
    当然,你可以分配多种调度到任务

    ->cron('* * * * *'); 在自定义 Cron 调度上运行任务 
    ->everyMinute(); 每分钟运行一次任务 
    ->everyFiveMinutes(); 每五分钟运行一次任务 
    ->everyTenMinutes(); 每十分钟运行一次任务 
    ->everyThirtyMinutes(); 每三十分钟运行一次任务 
    ->hourly(); 每小时运行一次任务 
    ->daily(); 每天凌晨零点运行任务 
    ->dailyAt('13:00'); 每天 13:00运行任务 
    ->twiceDaily(1, 13); 每天 1:00 & 13:00 运行任务 
    ->weekly(); 每周运行一次任务
    ->monthly(); 每月运行一次任务

    下面是额外的调度约束列表

    ->weekdays(); 只在工作日运行任务
    ->sundays(); 每个星期天运行任务
    ->mondays(); 每个星期一运行任务
    ->tuesdays(); 每个星期二运行任务
    ->wednesdays(); 每个星期三运行任务
    ->thursdays(); 每个星期四运行任务
    ->fridays(); 每个星期五运行任务
    ->saturdays(); 每个星期六运行任务
    ->when(Closure); 基于特定测试运行任务
    

      

     
  • 相关阅读:
    Shared Memory in Windows NT
    Layered Memory Management in Win32
    软件项目管理的75条建议
    Load pdbs when you need it
    Stray pointer 野指针
    About the Rebase and Bind operation in the production of software
    About "Serious Error: No RTTI Data"
    Realizing 4 GB of Address Space[MSDN]
    [bbk4397] 第1集 第一章 AMS介绍
    [bbk3204] 第67集 Chapter 17Monitoring and Detecting Lock Contention(00)
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15453393.html
Copyright © 2011-2022 走看看