Every entry you add is converted into an instance of Illuminate\Console\Scheduling\Event and stored in an $events class property of the Scheduler, an Event object consists of the following:

  • Command to run
  • CRON Expression
  • Timezone to be used to evaluate the time
  • Operating System User the command should run as
  • The list of Environments the command should run under
  • Maintenance mode configuration
  • Event Overlapping configuration
  • Command Foreground/Background running configuration
  • A list of checks to decide if the command should run or not
  • Configuration on how to handle the output
  • Callbacks to run after the command runs
  • Callbacks to run before the command runs
  • Description for the command
  • A unique Mutex for the command

The command to run could be one of the following:

  • A callback
  • A command to run on the operating system
  • An artisan command
  • A job to be dispatched

Using a callback

In case of a callback, the Container::call() method is used to run the value we pass which means we can pass a callable or a string representing a method on a class:

protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
}

Or:

protected function schedule(Schedule $schedule)
{
$schedule->call('MetricsRepository@cleanRecentUsers')->daily();
}

Passing a command for the operating system

If you would like to pass a command for the operating system to run you can use exec():

$schedule->exec('php /home/sendmail.php --user=10 --attachInvoice')->monthly();

You can also pass the parameters as an array:

$schedule->exec('php /home/sendmail.php', [
'--user=10',
'--subject' => 'Reminder',
'--attachInvoice'
])->monthly();

Passing an artisan command

$schedule->command('mail:send --user=10')->monthly();

You can also pass the class name:

$schedule->command('App\Console\Commands\EmailCommand', ['user' => 10])->monthly();

The values you pass are converted under the hood to an actual shell command and passed to exec() to run it on the operating system.

Dispatching a Job

You may dispatch a job to queue using the Job class name or an actual object:

$schedule->job('App\Jobs\SendOffer')->monthly();

$schedule->job(new SendOffer(10))->monthly();

Under the hood Laravel will create a callback that calls the dispatch() helper method to dispatch your command.

So the two actual methods of creating an event here is by calling exec() or call(), the first one submits an instance of Illuminate\Console\Scheduling\Event and the latter submits Illuminate\Console\Scheduling\CallbackEvent which has some special handling.

Building the cron expression

Using the timing method of the Scheduled Event, laravel builds a CRON expression for that event under the hood, by default the expression is set to run the command every minute:

* * * * * *

But when you call hourly() for example the expression will be updated to:

0 * * * * *

If you call dailyAt('13:30') for example the expression will be updated to:

30 13 * * * *

If you call twiceDaily(5, 14) for example the expression will be updated to:

0 5,14 * * * *

A very smart abstraction layer that saves you tons of research to find the right cron expression, however you can pass your own expression if you want as well:

$schedule->command('mail:send')->cron('0 * * * * *');

How about timezones?

If you want the CRON expression to be evaluated with respect to a specific timezone you can do that using:

->timezone('Europe/London')

Under the hood Laravel checks the timezone value you set and update the Carbon date instance to reflect that.

So laravel checks if the command is due using the CRON expression?

Exactly, Laravel uses the mtdowling/cron-expression library to determine if the command is due based on the current system time (with respect to the timezone we set).

Adding Constraints on running the command

Duration constraints

For example if you want the command to run daily but only between two specific dates:

->between('2017-05-27', '2017-06-26')->daily();

And if you want to prevent it from running during a specific period:

->unlessBetween('2017-05-27', '2017-06-26')->daily();

Environment constraints

You can use the environments() method to pass the list of environments the command is allowed to run under:

->environments('staging', 'production');

Maintenance Mode

By default scheduled commands won't run when the application is in maintenance mode, however you can change that by using:

->evenInMaintenanceMode()

OS User

You can set the Operating System user that'll run the command using:

->user('forge')

Under the hood Laravel will use sudo -u forge to set the user on the operating system.

Custom Constraints

You can define your own custom constraint using the when() and skip() methods:

// Runs the command only when the user count is greater than 1000
->when(function(){
return User::count() > 1000;
}); // Runs the command unless the user count is greater than 1000
->skip(function(){
return User::count() > 1000;
});

Before and After callbacks

Using the before() and then() methods you can register callbacks that'll run before or after the command finishes execution:

->before(function(){
Mail::to('myself@Mail.com', new CommandStarted());
})
->then(function(){
Mail::to('myself@Mail.com', new CommandFinished());
});

You can also ping URLs or webhooks using the pingBefore() and thenPing() methods:

->ping('https://my-webhook.com/start')->thenPing('https://my-webhook.com/finish')

Using these commands laravel registers a before/after callbacks under the hood and uses Guzzle to send a GET HTTP request:

return $this->before(function () use ($url) {
(new HttpClient)->get($url);
});

Properties of a scheduled job in Laravel的更多相关文章

  1. KBMMW 4.92.00 发布

    We are happy to announce the release of kbmMW Professional and Enterprise Edition. Yet again kbmMW c ...

  2. laravel/lumen 单元测试

    Testing Introduction Application Testing Interacting With Your Application Testing JSON APIs Session ...

  3. Laravel之Service Container服务容器

    managing class dependencies and performing dependency injection. Dependency injection is a fancy phr ...

  4. Laravel系列 目录结构

    Where Is The Models Directory? app directory by default 其中 app:,core code of your application, almos ...

  5. Laravel系列2入门使用

    最好的教程是官方文档! homestead安装好,就可以使用了. 安装Laravel composer create-project --prefer-dist laravel/laravel blo ...

  6. 50分钟学会Laravel 50个小技巧

    50分钟学会Laravel 50个小技巧 时间 2015-12-09 17:13:45  Yuansir-web菜鸟 原文  http://www.yuansir-web.com/2015/12/09 ...

  7. Quartz的配置文件quartz.properties详解

    配置 quartz.properties 文件 文件 quartz.properties 定义了 Quartz 应用运行时行为,还包含了许多能控制 Quartz 运转的属性.这个文件应该放在class ...

  8. Spring注解@Scheduled定时任务

    一.首先配置applicationContext-task.xml (1)添加 xmlns:task="http://www.springframework.org/schema/task& ...

  9. laravel 5.0 artisan 命令列表(中文简体)

    #php artisan list Laravel Framework version Usage: [options] command [arguments] Options(选项): --help ...

随机推荐

  1. “2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排

    “2017面向对象程序设计(Java)第十一周学习总结”存在问题的反馈及教学安排1.“提出表扬的同学:姜依萍,王雪玲,徐楠,相文君,赵晓未提交作业的同学:任红强,王瑞强,宗鹏新,扎西才让,布旦刀杰,范 ...

  2. kafka 消费者 timeout 6000

    kafka 消费者 timeout 6000 1:查看zookeeper 的状态,kafka默认是自带zookeeper配置,我建议安装单独的zookeeper  服务,并且配置文件也很简单..直接改 ...

  3. Java中的字节流,字符流,字节缓冲区,字符缓冲区复制文件

     一:创建方式 1.建立输入(读)对象,并绑定数据源 2.建立输出(写)对象,并绑定目的地 3.将读到的内容遍历出来,然后在通过字符或者字节写入 4.资源访问过后关闭,先创建的后关闭,后创建的先关闭 ...

  4. destructuring assignment

    [destructuring assignment] The destructuring assignment syntax is a JavaScript expression that makes ...

  5. Failure [INSTALL_CANCELED_BY_USER]

    安装app到真机,遇到 Failure [INSTALL_CANCELED_BY_USER] 错误. 解决方法:将手机的USB安装权限打开即可.设置->更多设置->开发者选项->US ...

  6. PasteDeploy部署Pecan API 服务

    part 1:请求处理 使用PasteDeploy模块来实现 WSGI Services 时,都需要加载一个 paste.ini 文件,文件用来定义服务过滤和请求路由,类似于springMvc的拦截器 ...

  7. cdnbest节点安装后连不上cdn主控原因排查

    1. 查看节点程序是否启动 ps -aux |grep kangle 2. 登陆cdn节点用telnet命令查下和主控的通信,命令:telnet 主控ip 3320 3. 如果节点程序都有启动,可查看 ...

  8. PAT1135(红黑书的判定)

    There is a kind of balanced binary search tree named red-black tree in the data structure. It has th ...

  9. CardView 卡片布局

    转自:https://www.baidu.com/link?url=WwHvfX3PB_egfQ6GFwxsDeq4NDzB2AW-zaTzskkNXs0qWnIcHyh3pN3Oqe6YO1lAmV ...

  10. redis 简介,安装与部署

    NOSQL简介 NoSQL,泛指非关系型的数据库,NoSQL数据库的四大分类: 键值(Key-Value)存储数据库:这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据 ...