ホームページ >バックエンド開発 >PHPチュートリアル >Laravel の基本的なチュートリアル - タスクの計画
タスクのスケジュールは、app/Console/Kernel.php ファイルのスケジュール メソッドで定義されます。始める前に、簡単な例を見てみましょう。実行したいタスク スケジュールをスケジュール オブジェクトに追加できます。
プランの実行を開始します
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1Cron は、Laravel のコマンド スケジュールを 1 分ごとに呼び出して、スケジュールされたタスクを実行します。 Laravel はタスクスケジュールを自動的に評価し、期限になったらタスクを実行します。
タスクを定義する
<?phpnamespace App\Console;use DB;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, ]; /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('recent_users')->delete(); })->daily(); }}Closure 呼び出しのスケジュールに加えて、Artisan コマンドとオペレーティング システム コマンドをスケジュールすることもできます。たとえば、コマンド メソッドを使用してアーティザン コマンドをスケジュールできます:
$schedule->command('emails:send --force')->daily();exec メソッドを使用してオペレーティング システムにコマンドを発行できます:
$schedule->exec('node /home/forge/script.js')->daily();スケジュール頻度オプション
Description | |
---|---|
カスタマイズされた Cron タスク プランを実行する | |
1分ごとにタスクを実行する | |
5分ごとにタスクを実行する | |
10分ごとにタスクを実行する | |
1時間ごとにタスクを実行します | |
深夜に1回タスクを実行します | |
毎日13:00にタスクを実行します | |
毎日1:00と13:00にタスクを実行します | |
週に一度タスクを実行します | |
月に一度タスクを実行します | |
4日および毎月 15 日: 00 はタスクを実行します | & & & gt; 四半期ごと (); /New_York'); |
これらのメソッドを追加の制約と組み合わせて、より細かく調整されたスケジュールを作成できます。特定の曜日のみ実行するなど。毎週月曜日に実行するようにスケジュール コマンドをスケジュールしましょう: | rrree|
Method | |
->weekdays(); |
& & & gt; 日曜日 () ) >金曜日( );
金曜日限定
土曜日限定 | -> ) ; |
---|---|
真值约束 when 方法可以基于给定的真值测试的结果来约束一个任务的执行。换种说法就是,如果给定的 Closure 返回 true,那么只要其他约束并不阻止任务的执行时,该任务就会被执行: $schedule->command('emails:send')->daily()->when(function () { return true;}); skip 方法刚好与 when 相反。如果 skip 方法返回 true,那么调度任务将不会执行: $schedule->command('emails:send')->daily()->skip(function () { return true; }); 当链式调用 when 方法时,只有在所有的 when 约束返回 true 时才会执行调度任务命令。 避免任务重叠默认的,如果前一个任务还在进程中,计划任务还是会再次运行的。你可以使用 withoutOverlapping 方法来避免这个: $schedule->command('emails:send')->withoutOverlapping(); 在这个例子中,emails:send Artisan 命令每分钟都会被调度,但是只有在进程中没有运行该命令时才会再次执行。withoutOverlapping 方法对于无法确定执行时间的任务特别有效,这样就可以避免同时执行越来越多的耗时任务增大服务器的压力。 任务输出Laravel 的任务计划提供了多种方便的方法来生成计划任务的输出。首先,你需要使用 sendOutputTo 方法,你可以传递一个文件路径到方法以便之后的检查: $schedule->command('emails:send') ->daily() ->sendOutputTo($filePath); 如果希望追加内容到给定的文件,你应该使用 appendOutputTo 方法: $schedule->command('emails:send') ->daily() ->appendOutputTo($filePath); 你可以使用 emailOutputTo 方法来将输出发送到你选定的邮箱地址中。但是你需要注意的是,你必须先使用 sendOutputTo 方法将输出发送到文件中。并且,在通过邮件发送任务的输出之前,你需要先配置好 laravel 的邮件服务: $schedule->command('foo') ->daily() ->sendOutputTo($filePath) ->emailOutputTo('foo@example.com')
任务钩子你可以使用 before 和 after 方法来在任务计划执行或者完成时执行特定的操作: $schedule->command('emails:send') ->daily() ->before(function () { // Task is about to start... }) ->after(function () { // Task is complete... }); Pingings URLs 使用 pingBefore 和 thenPing 方法,任务调度可以自动的在任务完成之前或者之后 ping 给定的 URL。这些方法通常用来通知外部的服务。比如 Laravel Envoyer,告知其计划任务将要执行或者已经完成: $schedule->command('emails:send') ->daily() ->pingBefore($url) ->thenPing($url); 使用 pingBefore($url) 或者 thenPing($url) 方法都需要引入 Guzzle HTTP 类库。你可以通过 Composer 来进行安装: "guzzlehttp/guzzle": "~5.3|~6.0" |