Laravel有内置命令调度器,能够方便的实现Cron.php
任务调度定义在app/Console/Kernel.php
文件的schedule
方法中,该方法已经包含了一个示例.Laravel里有两种方法执行Cron,第一种方法是让Cron每分钟调用Laravel命令调度,而后让Laravel来根据具体的命令来实现;须要在crontab里面加入以下内容:laravel
1
|
* * * * * php
/path/to/artisan
schedule:run 1>>
/dev/null
2>&1
|
本文主要讲第二种方法,既Artisan控制台.Artisan是Laravel自带的命令行接口名称,它提供了不少有用的命令想要查看全部可用的Artisan命令,可以使用list命令查看:shell
1
|
php artisan list
|
每一个命令均可以用help指令显示命令描述及命令参数和选项。想要查看帮助界面,只须要在命令前加上help就能够了,例如:json
1
|
php artisan help migrate
|
除了Artisan提供的命令以外,还能够构建本身的命令。能够将自定义命令存放在app/Console/Commands目录;固然,也能够本身选择存放位置,只要改命令能够基于composer.json被自动加载。bash
要建立一个新命令,可使用Artisan命令make:console,好比我要创一个发送邮件的artisan命令,能够这样:app
1
|
php artisan
make
:console SendEmails
|
上述命令将会生成一个类app/Console/Commands/SendEmails.php
,当建立命令时,--command
选项可用于分配终端命令名(在终端调用命令时用):composer
1
|
php artisan
make
:console SendEmails --
command
=emails:send
|
命令生成之后,须要填写该类的signature
和description
属性,这两个属性在调用list
显示命令的时候会被用到。handle
方法在命令执行时被调用,能够将全部命令逻辑都放在这个方法里面,咱们能够在命令控制器的构造函数中注入任何依赖.这个SendEmails.php里面内容参考以下:ide
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
<?php
namespace
App\Console\Commands;
use
Illuminate\Console\Command;
class
SendEmails
extends
Command {
/**
* The console command name.
*
* @var string
*/
protected
$name
=
'emails:send'
;
/**
* The console command description.
*
* @var string
*/
protected
$description
=
'这是发邮件的命令.'
;
/**
* Create a new command instance.
*
* @return void
*/
public
function
__construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public
function
handle()
{
//TODO:发送邮件逻辑
}
}
|
$name是这个命令的名称,即artisan调用时的命令,如本例命令设为了emails:send,那么实际调用时要这么用:函数
1
|
php artisan emails:send
|
执行上面这条命令就是执行handle()方法,固然,这里还漏了一个很是重要的关键步骤,那就是须要把命令注入到app/Console/Kernel.php
文件中,不然这个命令artisan是找不到的,示例以下:url
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?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'
,
'App\Console\Commands\SendEmails'
,
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected
function
schedule(Schedule
$schedule
)
{
$schedule
->command(
'inspire'
)
->hourly();
}
}
|
关键就是在$commands里面把要用到的SendEmails类放进去,好了,这样就能够经过artisan命令来执行脚本了.
因为artisan命令须要在Laravel的目录里面才能执行,因此实际要用crontab调用artisan命令时须要注意Crontab的shell代码要这样写,切记很是重要,不然是执行了不会运行实际处理逻辑的.
1
|
30 1 * * * php
/www/projects/laravelapp/artisan
emails:send
|
上面/www/projects/laravelapp/是项目的路径