Fitur penjadwalan tugas Laravel didokumentasikan dengan baik dan memberi Anda kekuatan penuh cron dalam API yang lancar. Dokumentasi mencakup sebagian besar dari apa yang Anda butuhkan untuk bangun dan berjalan dengan penjadwal dengan cepat, namun, ada beberapa konsep dasar yang ingin saya bahas terkait dengan cron yang akan membantu memperkuat pemahaman Anda tentang bagaimana Laravel menentukan tugas terjadwal mana yang harus dijalankan. .
Di dasar penjadwal Laravel, Anda perlu memahami cara menjadwalkan tugas di server melalui sintaks Cron yang agak membingungkan.
Sebelum kita mulai memahami cron dengan lebih baik dan sumber daya yang dapat Anda gunakan untuk membiasakan diri dengan cron, mari kita lihat bagian-bagian penting dari penjadwal.
Pertama, Anda mendefinisikan tugas terjadwal melalui metode App\Console\Kernel::schedule() pada aplikasi Laravel Anda:
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')
// ->hourly();
}
Anda dapat menggunakan metode ini untuk menentukan semua tugas terjadwal yang perlu dijalankan. Perintah metode instance Schedule () mengembalikan sebuah instance dari kelas Illuminate\Console\Scheduling\Event class.
Jika Anda ingin mengutak-atik / debug dengan instance kelas acara, Anda dapat membuang seperti contoh berikut:
$event = $schedule->command('inspire')
->hourly();
dd($event->expression); // "0 * * * *"
To trigger this method, run artisan :
> php artisan
"0 * * * *"
Contoh kejadian memiliki properti ekspresi yang menyimpan representasi cron dari tugas setelah panggilan API lancar.
Ingatlah nilai contoh ini saat kita berbicara tentang cron.
Laravel melindungi Anda dari cron dengan API lancar penjadwal — dalam contoh kami metode hourly () —tetapi memahami cron akan membantu Anda lebih memahami bagaimana memecahkan masalah apa yang terjadi di bawah tenda.
Berikut ini adalah representasi teks yang harus menjelaskan cara kerja cron jika Anda tidak terbiasa (walaupun Anda yakin saya ini masih berguna):
# Use the hash sign to prefix a comment
# +---------------- minute (0 - 59)
# | +------------- hour (0 - 23)
# | | +---------- day of month (1 - 31)
# | | | +------- month (1 - 12)
# | | | | +---- day of week (0 - 7) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
#-----------------------------------------------------------
Dengan menggunakan contoh "0 * * * *" di atas, tugas ini akan berjalan pada tanda nol menit setiap jam setiap hari setiap bulan pada setiap hari dalam seminggu.
Cron juga memiliki beberapa format lain yang mungkin terasa aneh, seperti ekspresi yang dihasilkan menggunakan metode triwulanan () Laravel:
0 0 1 1-12/3 *
Menjalankan tugas setiap triwulan berarti akan berjalan pada pukul 00:00 pada hari pertama bulan itu di setiap bulan ketiga dari Januari hingga Desember. Sintaks 1-12 / 3 yang aneh disebut "nilai langkah" yang dapat digunakan bersamaan dengan rentang. Halaman manual crontab - Linux menjelaskan nilai langkah sebagai berikut:
"Nilai langkah dapat digunakan bersama dengan rentang. Mengikuti rentang dengan "" menentukan lompatan dari nilai angka melalui rentang. Misalnya, "0-23 / 2" dapat digunakan di bidang jam untuk menentukan eksekusi perintah setiap jam (alternatif dalam standar V7 adalah "0,2,4,6,8,10,12,14, 16,18,20,22 "). Langkah-langkah juga diizinkan setelah tanda bintang, jadi jika Anda ingin mengatakan "setiap dua jam", gunakan saja "* / 2".
Saya mendorong Anda untuk membaca halaman manual, atau setidaknya tetap berguna jika Anda mengalami situasi di mana Anda perlu memahami jadwal cron yang mendasari untuk tugas yang lebih baik.
Laravel memiliki beberapa API lancar yang sangat baik yang memungkinkan Anda untuk menghubungkan beberapa panggilan metode secara bersamaan. Kelas acara penjadwalan tidak berbeda. Namun, ada beberapa nuansa dengan beberapa kombinasi yang mungkin Anda gunakan.
Ambil contoh berikut sebagai ilustrasi yang lebih baik: katakanlah kita ingin perintah dijalankan setiap jam, tetapi hanya pada hari Senin, Rabu, dan Jumat:
$schedule->command('inspire')
->hourly()
->mondays()
->wednesdays()
->fridays();Anda mungkin berpikir perintah di atas mencapai cron yang benar, tetapi itu bukan cara kerjanya. Dalam contoh di atas, metode "hari" terakhir yang dipanggil adalah fridays (), jadi, inilah cronnya:
0 * * * 5
Tugas di atas akan berjalan setiap jam, tetapi hanya pada hari Jumat.
Sebelum saya menunjukkan kepada Anda panggilan metode yang benar untuk mencapai apa yang kita inginkan, mari kita lihat metode Event::fridays(). Metode fridays() (dan banyak lainnya) berasal dari sifat ManagesFrequencies Laravel:
/**
* Schedule the event to run only on Fridays.
*
* @return $this
*/
public function fridays()
{
return $this->days(5);
}
Metode memanggil metode lain pada hari-hari sifat yang days() yang terlihat seperti berikut pada saat penulisan
/**
* Set the days of the week the command should run on.
*
* @param array|mixed $days
* @return $this
*/
public function days($days)
{
$days = is_array($days) ? $days : func_get_args();Anda dapat melihat detail bagaimana spliceIntoPosition () bekerja, tetapi semua metode "hari" saling menimpa, sehingga yang terakhir disebut stick.
Begini cara Anda menulis jadwal yang benar menggunakan Lancar API yang lancar:
$schedule->command('inspire')
->hourly()
->days([1, 3, 5]);
Mendebug tugas instance ini menghasilkan ekspresi berikut:
0 * * * 1,3,5
Bingo!
Sebagian besar waktu saya pikir kebanyakan orang lebih suka menggunakan API Laravel yang lancar. Namun, tugas acara mencakup metode cron () untuk mengatur ekspresi secara langsung:
$schedule->command('inspire')
->cron('0 * * * 1,3,5');Saya akan berpendapat bahwa Laravel's Fasih API adalah cara yang lebih mudah dibaca untuk mendefinisikan perintah, tetapi Anda bisa mendapatkan kekuatan penuh cron secara langsung dengan metode ini jika Anda lebih suka menggunakan sintaks cron.
Crontab Guru
Untuk kasus penggunaan tingkat lanjut dan pemahaman yang lebih baik tentang bagaimana tugas terjadwal Anda akan dijalankan, pertimbangkan untuk men-debug ekspresi cron yang mendasarinya dan menggunakan alat seperti crontab.guru - editor ekspresi jadwal cron.
Sumber Referensi : Laravel News