Artisan 是 Laravel 内置的命令行接口。它提供了一些有用的命令协助您开发,它是由强大的 Symfony Console 组件所驱动。
要查看所有可以使用的 Artisan 命令,你可以使用 list
命令:
php artisan list
每个命令都包含一个显示并描述这个命令能够接受哪些参数和选项的“帮助画面”。要浏览帮助画面,只需要在命令名称前面加上 help
即可:
php artisan help migrate
您可以指定要使用的环境配置,只要在执行命令时加上 --env
即可切换:
php artisan migrate --env=local
你也可以使用 --version
选项,查看目前安装的 Laravel 版本:
php artisan --version
有时你会希望在命令行接口以外的地方执行 Artisan 命令。例如,你可能会希望从 HTTP 路由调用 Artisan 命令。只要使用 Artisan
facade 即可:
Route::get('/foo', function()
{
$exitCode = Artisan::call('command:name', ['--option' => 'foo']);
//
});
你甚至可以把 Artisan 命令放到队列,他们会通过 队列工作者 在后台执行:
Route::get('/foo', function()
{
Artisan::queue('command:name', ['--option' => 'foo']);
//
});
过去,开发者会对每个他们想要调用的命令行指令建立 Cron 对象。然而,这很令人头痛。你的命令行指令调用不再包含在版本控制里面,并且你必须 SSH 进入你的服务器以添加 Cron 对象。让我们来让生活变得更轻松。Laravel 命令调用器允许你顺畅地且语义化地定义命令调用在 Laravel 里面,而且你的服务器只需要一个 Cron 对象。
你的命令调用保存在 app/Console/Kernel.php
文件。你会在这个类里看到一个 schedule
方法。为了帮助您开始,方法里面包含一个简单的例子。你可以依照你需要的自由地添加任何数量的预定工作到 Schedule
对象。你只需要添加这个 Cron 对象到服务器:
* * * * * php /path/to/artisan schedule:run 1>> /dev/null 2>&1
这个 Cron 将会每分钟调用 Laravel 命令调用器。接着,Laravel 评估你的预定工作并在时间到时执行工作。这不能再更简单了!
让我们来多看几个调用的例子:
$schedule->call(function()
{
// 执行一些任务...
})->hourly();
$schedule->exec('composer self-update')->daily();
$schedule->command('foo')->cron('* * * * *');
$schedule->command('foo')->everyFiveMinutes();
$schedule->command('foo')->everyTenMinutes();
$schedule->command('foo')->everyThirtyMinutes();
$schedule->command('foo')->daily();
$schedule->command('foo')->dailyAt('15:00');
$schedule->command('foo')->twiceDaily();
$schedule->command('foo')->weekdays();
$schedule->command('foo')->weekly();
// 调用每周一次在特定的日子 (0-6) 和时间的工作...
$schedule->command('foo')->weeklyOn(1, '8:00');
$schedule->command('foo')->monthly();
$schedule->command('foo')->mondays();
$schedule->command('foo')->tuesdays();
$schedule->command('foo')->wednesdays();
$schedule->command('foo')->thursdays();
$schedule->command('foo')->fridays();
$schedule->command('foo')->saturdays();
$schedule->command('foo')->sundays();
默认情况下,即使前一个工作实例正在运行中,被调用的工作也会同时被执行。如果要避免这件事情,你可以使用 withoutOverlapping
方法:
$schedule->command('foo')->withoutOverlapping();
在这个例子中,foo
命令每分钟都会被执行,除非他正在运行中。
$schedule->command('foo')->monthly()->environments('production');
$schedule->command('foo')->monthly()->evenInMaintenanceMode();
$schedule->command('foo')->monthly()->when(function()
{
return true;
});
$schedule->command('foo')->sendOutputTo($filePath)->emailOutputTo('foo@example.com');
注意: 你必须先把输出存到文件中才可以发送 email。
$schedule->command('foo')->sendOutputTo($filePath);
$schedule->command('foo')->thenPing($url);
使用 thenPing($url)
功能则必须引入 Guzzle HTTP 库。你能够通过添加下面这行代码至你的 composer.json
文件来添加 Guzzle 5 到你的项目中:
"guzzlehttp/guzzle": "~5.0"