Penjadualan tugas
- shell penjadualan perintah
- Had julat masa pada satu pelayan
- Mod penyelenggaraan
- Keluaran tugasan
- Task hook
- Ping URL
- Penjadualan Tugasan ling
- Tetapan Kekerapan Penjadualan
- Zon masa
- Elakkan pertindihan tugas
- Tugas hanya dijalankan pada satu pelayan
- Tugas latar belakang
- Mod penyelenggaraan
- Task hook
- Pengenalan Pada masa lalu, anda mungkin perlu membuat entri Cron untuk setiap tugas yang dijadualkan pada pelayan. Tetapi pendekatan ini dengan cepat menjadi tidak mesra kerana penjadual tugas ini tiada dalam kod sumber, dan anda perlu log masuk ke pelayan melalui pautan SSH setiap kali untuk menambah entri Cron.
Penjadual baris arahan Laravel membolehkan anda mentakrifkan penjadualan arahan dengan jelas dan lancar dalam Laravel. Dan apabila menggunakan penjadual tugas ini, anda hanya perlu mencipta antara muka masukan Cron tunggal pada pelayan anda. Jadual tugas anda ditakrifkan dalam kaedah Mulakan penjadual
Apabila menggunakan penjadual ini, anda hanya perlu menambah entri Cron berikut pada pelayan anda. Jika anda tidak tahu cara menambahkan entri Cron pada pelayan, anda boleh mempertimbangkan untuk menggunakan beberapa perkhidmatan untuk mengurus entri Cron, seperti Laravel Forge:* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
Cron ini ialah penjadual baris arahan yang melaksanakan Laravel setiap minit. Apabila perintahschedule:run
dilaksanakan, Laravel akan melaksanakan program yang dijadualkan mengikut jadual anda.Tentukan jadualAnda boleh melakukan ini dalam kelasAppConsoleKernel
Semua tugas penjadualan ditakrifkan dalam kaedah >jadual. Sebelum kita mula, mari kita lihat contoh. Dalam contoh ini, kami merancang untuk membuat penutupan setiap hari pada tengah malam. Dalam penutupan, kami melaksanakan pertanyaan pangkalan data untuk mengosongkan jadual:<?php namespace App\Console; use Illuminate\Support\Facades\DB; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel{ /** * 应用里的自定义 Artisan 命令 * * @var array */ protected $commands = [ // ]; /** * 定义计划任务 * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('recent_users')->delete(); })->daily(); } }
Selain menggunakan penutupan untuk mentakrifkan jadual tugas, anda juga boleh menggunakan
objek boleh invokasi.
$schedule->call(new DeleteRecentUsers)->daily();
app/Console/Kernel.php
的schedule
方法中进行定义。为了帮助你更好的入门,这个方法中有个简单的例子。启动调度器
当使用这个调度器时,你只需要把下面的 Cron 入口添加到你的服务器中即可。如果你不知道怎么在服务器中添加 Cron 入口,可以考虑使用一些服务来管理 Cron 入口,比如 Laravel Forge:
$schedule->command('emails:send --force')->daily(); $schedule->command(EmailsCommand::class, ['--force'])->daily();
这个 Cron 为每分钟执行一次 Laravel 的命令行调度器。当
schedule:run
命令被执行的时候,Laravel 会根据你的调度执行预定的程序。定义调度
你可以在
AppConsoleKernel
类的schedule
Penjadualan arahan Artisan
Selain menjadualkan dengan memanggil penutupan, anda juga boleh memanggil arahan Artisan dan arahan sistem pengendalian. Sebagai contoh, anda boleh menghantar arahan Artisan dengan menghantar nama perintah atau kelas kepada kaedah
command
.command
方法传递命令名称或者类来调度一个 Artisan 命令。$schedule->job(new Heartbeat)->everyFiveMinutes(); // 分发任务到「heartbeats」队列... $schedule->job(new Heartbeat, 'heartbeats')->everyFiveMinutes();
队列任务调度
job
方法可以用来调度 队列任务。此方法提供了一种快捷的方式来调度任务,而无需使用call
方法创建闭包来调度任务。$schedule->exec('node /home/forge/script.js')->daily();
Shell 命令调度
exec
// 每周一 13:00 执行... $schedule->call(function () { // })->weekly()->mondays()->at('13:00'); // 工作日(周一至周五) 8点 至 17 点每小时执行一次... $schedule->command('foo') ->weekdays() ->hourly() ->timezone('America/Chicago') ->between('8:00', '17:00');
Penjadualan tugas beraturkerja kaedah boleh digunakan untuk menjadualkan tugas beratur. Kaedah ini menyediakan cara cepat untuk menjadualkan tugas tanpa perlu membuat penutupan menggunakan kaedah panggilan
untuk menjadualkan tugas. 🎜$schedule->command('reminders:send') ->hourly() ->between('7:00', '22:00');
🎜🎜🎜🎜🎜Shell command scheduling🎜🎜exec
kaedah boleh digunakan Hantar arahan ke sistem pengendalian: 🎜$schedule->command('reminders:send') ->hourly() ->unlessBetween('23:00', '4:00');
🎜🎜🎜🎜🎜🎜Tetapan kekerapan penjadualan
Sudah tentu, anda boleh menetapkan berbilang pelan penjadualan untuk tugas anda:
🎜 Laksanakan tugasan pada pukul 15:00 pada 4hb setiap bulan🎜🎜🎜🎜Kaedah Penerangan ->cron('* * * * *'); ->cron('* * * * *');
自定义 Cron 时间表执行任务 ->everyMinute();
每分钟执行一次任务 ->everyFiveMinutes();
每五分钟执行一次任务 ->everyTenMinutes();
每十分钟执行一次任务 ->everyFifteenMinutes();
每十五分钟执行一次任务 ->everyThirtyMinutes();
每三十分钟执行一次任务 ->hourly();
每小时执行一次任务 ->hourlyAt(17);
每小时第 17 分钟执行一次任务 ->daily();
每天午夜执行一次任务(译者注:每天零点) ->dailyAt('13:00');
每天 13 点执行一次任务 ->twiceDaily(1, 13);
每天 1 点 和 13 点分别执行一次任务 ->weekly();
每周执行一次任务 🎜Laksanakan tugas setiap minit🎜🎜🎜🎜 Cron tersuai <->weeklyOn(1, '8:00');
tugas pelaksanaan >everyMinute();->everyFiveMinutes();🎜🎜Laksanakan tugas setiap lima minit🎜🎜🎜>🎜 ->everyTenMinutes();🎜🎜Laksanakan tugas setiap sepuluh minit🎜🎜🎜🎜 ->everyFifteenMinutes();🎜🎜Laksanakan tugas setiap lima belas minit🎜🎜🎜 code>->everyThirtyMinutes();🎜🎜Laksanakan tugas setiap tiga puluh minit🎜🎜🎜🎜 ->hourly();🎜🎜Laksanakan tugas setiap jam 🎜🎜🎜 ->hourlyAt(17);
🎜🎜Laksanakan tugas pada minit ke-17 setiap jam🎜🎜🎜🎜->daily();
🎜🎜Setiap hari Laksanakan tugasan pada tengah malam (Nota penterjemah: pukul sifar setiap hari)🎜🎜🎜🎜->dailyAt('13:00');🎜🎜Laksanakan tugas pada pukul 13:00 setiap hari🎜🎜 🎜🎜 ->twiceDaily(1, 13);🎜🎜Laksanakan tugasan sekali setiap hari pada pukul 1:00 dan 13:00🎜🎜🎜🎜 ->mingguan(); kod>🎜🎜Laksanakan sekali seminggu Tugasan🎜🎜🎜🎜 ->weeklyOn(1, '8:00');🎜🎜Laksanakan tugas setiap hari Isnin jam 8🎜🎜 ->monthly(); ->monthly();
每月执行一次任务 ->monthlyOn(4, '15:00');
每月 4 号的 15 点执行一次任务 ->quarterly();
每季度执行一次任务 ->yearly();
每年执行一次任务 Laksanakan tugas sebulan sekali->timezone('America/New_York');
->monthlyOn(4, '15:00');
->suku tahunan();🎜🎜Laksanakan tugas setiap suku tahun🎜🎜🎜🎜 ->tahunan ();< /code>🎜🎜Laksanakan tugas sekali setahun🎜🎜🎜🎜 ->zon waktu('America/New_York');🎜🎜Tetapkan zon waktu🎜🎜🎜🎜 Digabungkan dengan beberapa syarat khusus lain, kami boleh menjana tugasan yang dijalankan pada masa tertentu dalam seminggu. Sebagai contoh, untuk melaksanakan arahan setiap hari Isnin:
$schedule->command('emails:send')->daily()->when(function () { return true; });
Senarai kekangan tambahan adalah seperti berikut:
Hadkan tugasan untuk dilaksanakan pada hari bekerja🎜🎜🎜🎜Kaedah Penerangan > ->weekdays();
限制任务在工作日执行 ->weekends();
限制任务在周末执行 ->sundays();
限制任务在周日执行 ->mondays();
限制任务在周一执行 ->tuesdays();
限制任务在周二执行 ->wednesdays();
限制任务在周三执行 ->thursdays();
限制任务在周四执行 ->fridays();
限制任务在周五执行 ->saturdays();
限制任务在周六执行 ->between($start, $end);
限制任务在 $start
和$end
之间执行->when(Closure);
当闭包返回为真时执行 ;(kod minggu) >->environments($env);
>> ->hujung minggu();🎜🎜Hadkan tugasan untuk dilaksanakan pada hujung minggu🎜🎜🎜🎜(gt;sunda>ys) ; 🎜🎜Hadkan tugasan untuk dilaksanakan pada hari Ahad🎜🎜🎜🎜 ->isnin();🎜🎜Hadkan tugasan untuk dilaksanakan pada hari Isnin🎜🎜🎜>🎜🎜🎜>-> 🎜🎜Hadkan tugasan untuk dilaksanakan pada hari Selasa🎜🎜🎜🎜 ->wednesdays();🎜🎜Hadkan tugasan untuk dilaksanakan pada hari Rabu🎜<🎜🎜 kod>->khamis();🎜🎜Hadkan tugasan untuk dilaksanakan pada hari Khamis🎜🎜🎜🎜 ->jumaat();🎜🎜Hadkan tugasan untuk dilaksanakan pada hari Jumaat🎜 🎜🎜🎜 ->sabtu();< /code>🎜🎜Hadkan tugasan untuk dilaksanakan pada hari Sabtu🎜🎜🎜🎜 ->antara($mula, $end);🎜 🎜Hadkan tugasan untuk dilaksanakan antara $start
dan$end
Dilaksanakan antara 🎜🎜🎜🎜->when(Closure);
🎜🎜Dilaksanakan apabila penutupan kembali benar🎜🎜🎜🎜-> environments($env);🎜🎜Hadkan tugasan untuk dilaksanakan dalam persekitaran tertentu🎜🎜🎜🎜 Sekatan julat masa
Gunakan
antara untuk mengehadkan tugas kepada tempoh masa tertentu dalam sehari: between
来限制任务在一天中的某个时间段来执行:$schedule->command('emails:send')->daily()->skip(function () { return true; });
或者使用
unlessBetween
方法来为任务排除一个时间段:$schedule->command('emails:send') ->daily() ->environments(['staging', 'production']);
闭包测试限制
使用
when
方法来根据测试结果来执行任务。也就是说,如果给定的闭包返回结果为true
,只要没有其他约束条件阻止任务运行,任务就会一直执行下去:$schedule->command('report:generate') ->timezone('America/New_York') ->at('02:00')
skip
方法可以看做是when
方法的逆过程。如果skip
方法返回true
,任务就不会执行:/** * 获取默认情况下应为预定事件使用的时区。 * * @return \DateTimeZone|string|null */ protected function scheduleTimezone(){ return 'America/Chicago'; }
使用链式调用
when
方法时,只有所有的when
都返回true
时,任务才会执行。环境约束
environments
方法可用于仅在给定环境中执行任务:$schedule->command('emails:send')->withoutOverlapping();
时区
使用
timezone
方法,你可以指定任务在给定的时区内执行:$schedule->command('emails:send')->withoutOverlapping(10);
如果要为所有计划任务分配相同的时区,则可能希望在
app/Console/Kernel.php
文件中定义scheduleTimezone
方法。 此方法应返回应分配给所有计划任务的默认时区:$schedule->command('report:generate') ->fridays() ->at('17:00') ->onOneServer();
{note} 请记住,有些时区会使用夏令时。当夏时制时间发生更改时,你的任务可能会执行两次,甚至根本不会执行。所以我们建议尽可能避免使用时区来安排计划任务。
避免任务重复
默认情况下,即使之前的任务还在执行,调度内任务也会执行。你可以使用
withoutOverlapping
方法来避免这种情况:$schedule->command('analytics:report') ->daily() ->runInBackground();
在这个例子中,如果
emails:send
Artisan 命令 没有正在运行,它将会每分钟执行一次。如果你的任务执行时间不确定,且你又不能准确预估出任务的执行时间,那么withoutOverlapping
$schedule->command('emails:send')->evenInMaintenanceMode();
atau gunakan kaedahkecualiAntara untuk mengecualikan masa tugas Tempoh: $schedule->command('emails:send') ->daily() ->sendOutputTo($filePath);
Penutupan Had UjianGunakan kaedah
bila untuk melaksanakan tugas berdasarkan keputusan ujian. Maksudnya, jika penutupan yang diberikan mengembalikan true
, tugasan akan terus dilaksanakan selagi tiada kekangan lain yang menghalang tugasan daripada dijalankan:$schedule->command('emails:send') ->daily() ->appendOutputTo($filePath);
langkau kaedah Ia boleh dilihat sebagai proses terbalik kaedah bila
. Jika kaedahlangkau
mengembalikantrue
, tugasan tidak akan dilaksanakan:$schedule->command('foo') ->daily() ->sendOutputTo($filePath) ->emailOutputTo('foo@example.com');
🎜Apabila memanggil kaedahbila
dalam rantai, hanya semua < code> Apabila kedua-duanya mengembalikantrue
, tugasan akan dilaksanakan. 🎜🎜🎜Kekangan persekitaran🎜🎜 Kaedahpersekitaran boleh digunakan untuk melaksanakan tugas hanya dalam persekitaran tertentu: 🎜 $schedule->command('emails:send') ->daily() ->before(function () { // Task is about to start... }) ->after(function () { // Task is complete... });
🎜🎜🎜🎜Timezone
🎜Menggunakan kaedahtimezone
, anda boleh menentukan bahawa tugas itu dalam zon waktu tertentu Pelaksanaan dalam: 🎜$schedule->command('emails:send') ->daily() ->pingBefore($url) ->thenPing($url);
🎜 Jika anda ingin menetapkan zon waktu yang sama kepada semua tugas yang dijadualkan, anda mungkin mahu menentukan kaedahscheduleTimezone
dalamapp/Console/Kernel .php
fail. Kaedah ini harus mengembalikan zon waktu lalai yang harus diperuntukkan kepada semua tugas yang dijadualkan: 🎜$schedule->command('emails:send') ->daily() ->pingBeforeIf($condition, $url) ->thenPingIf($condition, $url);
🎜{note} Perlu diingat bahawa sesetengah zon waktu menggunakan waktu penjimatan siang. Apabila masa penjimatan siang berubah, tugas anda mungkin dilaksanakan dua kali atau tidak sama sekali. Oleh itu, kami mengesyorkan untuk mengelak daripada menggunakan zon waktu untuk menjadualkan tugas yang dijadualkan apabila boleh. 🎜
🎜🎜🎜🎜Mencegah pertindihan tugas
🎜Secara lalai , walaupun tugas sebelumnya masih dilaksanakan, tugas yang dijadualkan akan dilaksanakan. Anda boleh mengelakkan ini menggunakan kaedahtanpa Bertindih
: 🎜composer require guzzlehttp/guzzle
🎜Dalam contoh ini, jika perintahemail:send
Artisan tidak berjalan, ia akan dilaksanakan setiap minit . Kaedahtanpa Bertindih
amat berguna jika masa pelaksanaan tugas anda tidak pasti dan anda tidak boleh menganggarkan masa pelaksanaan tugas dengan tepat. 🎜🎜Jika perlu, anda boleh menentukan "tanpa bertindih" untuk mengunci julat masa yang ditentukan. Secara lalai, kunci tamat tempoh selepas 24 jam. 🎜rrreee🎜🎜🎜🎜🎜🎜Tugas hanya berjalan pada satu pelayan
{note} Untuk menggunakan ciri ini, pemacu cache lalai aplikasi anda mestilah
memcached
atauredis
. Di samping itu, semua pelayan mesti berkomunikasi menggunakan pelayan cache pusat yang sama.memcached
或者redis
。除此之外,所有的服务器必须使用同一个中央缓存服务器通信。如果你的应用在多个服务器上运行,你可能需要限制你的调度任务只在单个服务器上运行。假设你有一个调度任务:每周五晚生成一份新报告。如果这个任务调度器在三个服务器上运行,那么这个任务会在三台服务器上运行且生成三份报告。这样不好!
为了说明任务应该在单个服务器上运行,在定义调度任务时使用
rrreeeonOneServer
方法。第一个获取到任务的服务器会生成一个原子锁,用来防止其他服务器在同一时刻执行相同任务。后台任务
默认情况下,同时调度的多个命令将按顺序执行。如果你有长时间运行的命令,这可能会导致后续命令的启动时间比预期的要晚。因此,你想在后台同时运行命令,可以使用
rrreeerunInBackground
方法:维护模式
Laravel 的队列任务在 维护模式 下不会运行。因为我们不想你的调度任务干扰到你服务器上可能还未完成的项目。不过,如果你确实是想在维护模式下强制调度任务执行,你可以使用
rrreeeevenInMaintenanceMode
方法:任务输出
Laravel 调度器提供了一些方便的方法来处理调度任务输出。首先,你可以使用
rrreeesendOutputTo
方法来输出到文件以便于后续检查:如果希望将输出
rrreee附加
到给定文件,可以使用appendOutputTo
方法使用
rrreeeemailOutputTo
方法,你可以将输出发送到指定邮箱。在使用邮件发送之前,你需要配置 Laravel 的 邮件服务:{note}
emailOutputTo
,sendOutputTo
和appendOutputTo
方法是command
和exec
独有的。任务钩子
使用
Jika aplikasi anda berjalan pada berbilang pelayan, anda mungkin mahu mengehadkan tugasan anda yang dijadualkan untuk dijalankan pada satu pelayan sahaja. Katakan anda mempunyai jadual yang menghasilkan laporan baharu setiap malam Jumaat. Jika penjadual tugas berjalan pada tiga pelayan, maka tugasan akan dijalankan pada tiga pelayan dan menghasilkan tiga laporan. Ini tidak bagus! Untuk menunjukkan bahawa tugas harus dijalankan pada pelayan tunggal, gunakan kaedahbefore
和after
onOneServer
apabila mentakrifkan tugasan yang dijadualkan. Pelayan pertama yang memperoleh tugas akan menjana kunci atom untuk menghalang pelayan lain daripada melaksanakan tugas yang sama pada masa yang sama. 🎜rrreee🎜🎜🎜🎜Tugas latar belakang🎜🎜Secara lalai, berbilang arahan yang dijadualkan serentak akan Melaksanakan mengikut tertib . Jika anda mempunyai arahan yang berjalan lama, ini boleh menyebabkan arahan seterusnya bermula lewat daripada jangkaan. Oleh itu, jika anda ingin menjalankan arahan di latar belakang pada masa yang sama, anda boleh menggunakan kaedahrunInBackground
: 🎜rrreee🎜🎜🎜🎜Mod Penyelenggaraan🎜🎜Tugas baris gilir Laravel tidak akan dijalankan dalam mod penyelenggaraan. Kerana kami tidak mahu tugas penjadualan anda mengganggu projek yang mungkin tidak dapat diselesaikan pada pelayan anda. Walau bagaimanapun, jika anda benar-benar mahu memaksa pelaksanaan tugas berjadual dalam mod penyelenggaraan, anda boleh menggunakan kaedahevenInMaintenanceMode
: 🎜rrreee🎜🎜🎜Output Tugas
🎜Penjadual Laravel menyediakan beberapa kaedah mudah untuk mengendalikan output tugasan yang dijadualkan. Mula-mula, anda boleh menggunakan kaedahsendOutputTo
untuk mengeluarkan ke fail untuk pemeriksaan kemudian: 🎜rrreee🎜 Jika anda inginmenambahkan
output pada fail tertentu, anda boleh menggunakan < code>appendOutputTo< /code> Kaedah 🎜rrreee🎜Menggunakan kaedahemailOutputTo
, anda boleh menghantar output ke peti mel yang ditentukan. Sebelum menggunakan e-mel untuk menghantar, anda perlu mengkonfigurasi perkhidmatan e-mel Laravel: 🎜rrreee🎜🎜{note} KaedahemailOutputTo
,sendOutputTo
danappendOutputTo
adalah < Unik kepada kod>perintah danexec
. 🎜🎜🎜🎜. 🎜🎜Task hooks
🎜Gunakansebelum
danafter
kaedah, anda boleh melaksanakan kod tertentu sebelum atau selepas tugasan yang dijadualkan dilaksanakan: 🎜rrreee🎜🎜Ping URL
Menggunakan kaedah
rrreeepingBefore
danthenPing
, anda boleh ping URL yang ditentukan sebelum atau selepas pelaksanaan tugas. Kaedah ini amat berguna apabila memberitahu perkhidmatan luaran (seperti Laravel EnvoyerpingBefore
和thenPing
方法,你可以在任务执行前或者执行后来 ping 指定的 URL。这个方法在通知外部服务(比如 Laravel Envoyer)时将会特别有用:只有在给定条件为
rrreeetrue
时,才能使用pingBeforeIf
和thenPingIf
):Hanya jika diberikan Sahaja apabila syarat adalah
rrreeetrue
bolehkah anda menggunakan kaedahpingBeforeIf
danthenPingIf
untuk ping URL yang ditentukan:Semua kaedah ping memerlukan HTTP Guzzle perpustakaan. Anda boleh menggunakan Komposer untuk menambah Guzzle pada projek anda: rrreeeArtikel ini mula-mula muncul di tapak webLearnKu.com← beraturLaman web PHP Cina
jadual
app/Console/Kernel.php
. Untuk membantu anda bermula, berikut ialah contoh mudah dalam kaedah ini.
- Scheduling frekuensi pengaturan