1. Code
  2. PHP
  3. Laravel

Task Scheduling di Laravel

Dalam artikel ini, kita akan mendalami salah satu fitur menarik dari Laravel web framework-task scheduling. Sepanjang artikel ini, kita akan melihat bagaimana Laravel memungkinkan Anda untuk mengelola tugas-tugas terjadwal dalam aplikasi Anda. Selain itu, kami juga akan berakhir membuat kostum tugas terjadwal kami sendiri untuk keperluan demonstrasi.
Scroll to top

Indonesian (Bahasa Indonesia) translation by Sap (you can also view the original English article)

Dalam artikel ini, kita akan mendalami salah satu fitur menarik dari Laravel web framework-task scheduling. Sepanjang artikel ini, kita akan melihat bagaimana Laravel memungkinkan Anda untuk mengelola tugas-tugas terjadwal dalam aplikasi Anda. Selain itu, kami juga akan berakhir membuat kostum tugas terjadwal kami sendiri untuk keperluan demonstrasi.

Laravel framework memungkinkan Anda untuk mengatur scheduled tasks sehingga Anda tidak perlu khawatir tentang pengaturan mereka pada tingkat sistem. Anda dapat menyingkirkan complex cron syntax tersebut sementara menetapkan tugas terjadwal sejak Laravel memungkinkan Anda untuk menentukan mereka dalam cara yang user-friendly.

Kita akan mulai artikel dengan bagaimana Anda gunakan untuk menyiapkan tradisional cron jobs, dan berikut bahwa kita akan menjelajahi cara Laravel untuk mencapainya. Di pertengahan artikel, kita akan mencobanya dengan membuat beberapa custom scheduled tasks yang harus memberikan wawasan langsung tentang subject.

Cara sederhana Pengaturan Scheduled Task

Dalam pengembangan aplikasi sehari-hari Anda, Anda sering menghadapi situasi yang mengharuskan Anda untuk menjalankan scripts tertentu atau perintah secara berkala. Jika Anda bekerja dengan sistem * nix, Anda akan mungkin mengetahui bahwa cron jobs menangani perintah ini. Di sisi lain, mereka dikenal sebagai tugas-tugas yang dijadwalkan pada sistem berbasis Windows.

Mari kita lihat sekilas contoh sederhana * nix berbasis cron job.

1
*/5 * * * * /web/statistics.sh

Cukup sederhana-file statistics.sh yang berjalan setiap lima menit!

Meskipun itu adalah kasus penggunaan yang sangat sederhana, Anda sering menemukan diri Anda dalam situasi yang membutuhkan untuk menerapkan penggunaan kasus yang lebih kompleks. Di sisi lain, sistem yang kompleks membutuhkan Anda untuk menentukan beberapa cron jobs yang dijalankan pada interval waktu yang berbeda.

Mari kita lihat beberapa tugas aplikasi web yang kompleks telah tampil secara berkala di back-end.

  • Bersihkan data yang tidak perlu dari database back-end.
  • Memperbarui indeks caching front-end untuk tetap up-to-date.
  • Menghitung statistik situs.
  • Kirim email.
  • Back up elemen situs yang berbeda.
  • Menghasilkan laporan.
  • Dan banyak lagi.

Jadi, seperti yang Anda lihat, ada banyak hal di luar sana menunggu untuk dijalankan secara berkala dan juga pada interval waktu yang berbeda. Jika Anda seorang system admin berpengalaman, itu mudah untuk Anda untuk menentukan cron jobs untuk semua tugas ini, tapi kadang-kadang kita sebagai developers berharap bahwa ada cara yang lebih mudah.

Untungnya, Laravel datang dengan built-in Task Scheduling API yang memungkinkan Anda untuk menentukan tugas-tugas yang dijadwalkan tidak seperti sebelumnya. Dan ya, Bagian berikutnya adalah semua tentang itu-dasar-dasar Laravel task scheduling.

Cara Laravel

Dalam sesi sebelumnya, kami pergi melalui cara sederhana pengaturan cron jobs. Dalam bagian ini, kita akan mendalami melalui spesifik Laravel dalam konteks Task Scheduling API.

Sebelum kita melanjutkannya, yang penting untuk di mengerti adalah bahwa fitur penjadwalan yang disediakan oleh Laravel adalah seperti fitur lainnya dan tidak akan dipanggil secara otomatis. Jadi jika Anda berpikir bahwa Anda tidak perlu melakukan apa-apa pada system level maka saya katakan, Anda kurang beruntung.

Bahkan, hal pertama yang harus Anda lakukan jika Anda ingin menggunakan Laravel scheduling system adalah untuk menyiapkan cron job yang berjalan setiap menit dan memanggil perintah artisan yang ditampilkan dalam potongan berikut.

1
* * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

Perintah artisan di atas adalah panggilan Laravel scheduler, dan yang pada gilirannya mengeksekusi Semua cron jobs yang tertunda didefinisikan dalam aplikasi Anda.

Tentu saja, namun kita akan melihat bagaimana untuk menentukan scheduled tasks dalam aplikasi Laravel Anda, dan itu hal yang berikutnya kita dalami.

Ini adalah schedule method App\Console\Kernel class yang perlu Anda gunakan jika Anda ingin menentukan tugas-tugas aplikasi lebih spesifik.

silahkan ambil isi dari app/Console/Kernel.php file.

1
<?php namespace App\Console;
2
use Illuminate\Console\Scheduling\Schedule;
3
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
4
5
class Kernel extends ConsoleKernel {
6
  /**

7
   * The Artisan commands provided by your application.

8
   *

9
   * @var array

10
   */
11
  protected $commands = [
12
    'App\Console\Commands\Inspire',
13
  ];
14
  
15
  /**

16
   * Define the application's command schedule.

17
   *

18
   * @param  \Illuminate\Console\Scheduling\Schedule  $schedule

19
   * @return void

20
   */
21
  protected function schedule(Schedule $schedule)
22
  {
23
    $schedule->command('inspire')->hourly();
24
  }
25
}

Seperti yang Anda lihat, inti code itu sendiri menyediakan contoh yang berguna. Dalam contoh di atas, Laravel menjalankan perintah artisan inspire per jam. Tidakkah Anda berpikir bahwa syntax sangat intuitif di saat pertama?

Bahkan, ada beberapa cara yang berbeda Laravel di mana memungkinkan Anda untuk menentukan schedule tasks:

  • Gunakan closure/callable.
  • Memanggil artisan command.
  • Mengeksekusi shell command.

Selain itu, ada banyak built-in frekuensi scheduling yang bisa Anda pilih dari:

  • setiap menit/setiap lima menit
  • jam/harian/mingguan/triwulanan/tahunan
  • pada waktu hari tertentu
  • dan banyak lagi

Bahkan, saya akan mengatakan bahwa ia menyediakan satu set lengkap rutinitas sehingga Anda tidak pernah perlu menyentuh shell untuk membuat custom cron jobs Anda!

Ya saya dapat memberitahu bahwa Anda ingin tahu bagaimana menerapkan custom scheduled tasks, dan itu adalah apa yang juga saya janjikan pada awal artikel.

Membuat Scheduled Task pertama Anda di Laravel

Seperti yang kita bahas, ada berbagai cara di mana Laravel memungkinkan Anda untuk menentukan tugas-tugas yang dijadwalkan. Mari kita pergi melalui masing-masing untuk memahami cara kerjanya.

Method Closure/Callable

API scheduling menyediakan method call yang memungkinkan Anda untuk melaksanakan callable atau closure function. Mari kita merevisi file app/Console/Kernel.php tersebut dengan kode berikut.

1
<?php
2
namespace App\Console;
3
4
use Illuminate\Support\Facades\DB;
5
use Illuminate\Console\Scheduling\Schedule;
6
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
7
8
class Kernel extends ConsoleKernel
9
{
10
  /**

11
   * Define the application's command schedule.

12
   *

13
   * @param  \Illuminate\Console\Scheduling\Schedule  $schedule

14
   * @return void

15
   */
16
  protected function schedule(Schedule $schedule)
17
  {
18
    // the call method

19
    $schedule->call(function () {
20
      $posts = DB::table('posts')
21
        ->select('user_id', DB::raw('count(*) as total_posts'))
22
        ->groupBy('user_id')
23
        ->get();
24
25
      foreach($posts as $post)
26
      {
27
        DB::table('users_statistics')
28
          ->where('user_id', $post->user_id)
29
          ->update(['total_posts' => $post->total_posts]);
30
      }
31
    })->everyThirtyMinutes();
32
  }
33
}

Seperti yang Anda lihat, kami telah melewati closure function sebagai argumen pertama dari method call. Juga, kami telah mengatur frekuensi untuk setiap 30 menit, sehingga hal ini akan melaksanakan closure function setiap 30 menit!

Di dalam contoh, kita menghitung total posting per pengguna dan memperbarui tabel statistics yang sesuai.

Perintah Artisan

Selain dari closures atau callables, Anda juga bisa perintah artisan schedule yang akan dieksekusi pada interval tertentu. Pada kenyataannya, yang seharusnya menjadi pendekatan yang lebih disukai atas closures karena menyediakan lebih baik code organization dan usabilitas pada waktu yang sama.

Lanjutkan dan revisi isi dari file app/Console/Kernel.php dengan petunjuk berikut.

1
<?php
2
namespace App\Console;
3
4
use Illuminate\Support\Facades\Config;
5
use Illuminate\Console\Scheduling\Schedule;
6
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
7
8
class Kernel extends ConsoleKernel
9
{
10
  /**

11
   * The Artisan commands provided by your application.

12
   *

13
   * @var array

14
   */
15
  protected $commands = [
16
    'App\Console\Commands\UserStatistics'
17
  ];
18
 
19
  /**

20
   * Define the application's command schedule.

21
   *

22
   * @param  \Illuminate\Console\Scheduling\Schedule  $schedule

23
   * @return void

24
   */
25
  protected function schedule(Schedule $schedule)
26
  {
27
    // artisan command method

28
    $schedule->command('statistics:user')->everyThirtyMinutes();
29
  }
30
 
31
  /**

32
   * Register the Closure based commands for the application.

33
   *

34
   * @return void

35
   */
36
  protected function commands()
37
  {
38
    require base_path('routes/console.php');
39
  }
40
}

Ini adalah command method yang Anda gunakan jika Anda ingin perintah schedule artisan seperti yang ditunjukkan dalam potongan kode di atas. Anda harus lulus perintah artisan signature sebagai argumen pertama command method.

Tentu saja, Anda perlu mendefinisikan perintah artisan sesuai juga di app/Console/Commands/UserStatistics.php.

1
<?php
2
namespace App\Console\Commands;
3
4
use Illuminate\Console\Command;
5
use Illuminate\Support\Facades\DB;
6
7
class UserStatistics extends Command
8
{
9
  /**

10
   * The name and signature of the console command.

11
   *

12
   * @var string

13
   */
14
  protected $signature = 'statistics:user';
15
16
  /**

17
   * The console command description.

18
   *

19
   * @var string

20
   */
21
  protected $description = 'Update user statistics';
22
23
  /**

24
   * Create a new command instance.

25
   *

26
   * @return void

27
   */
28
  public function __construct()
29
  {
30
    parent::__construct();
31
  }
32
33
  /**

34
   * Execute the console command.

35
   *

36
   * @return mixed

37
   */
38
  public function handle()
39
  {
40
    // calculate new statistics

41
    $posts = DB::table('posts')
42
      ->select('user_id', DB::raw('count(*) as total_posts'))
43
      ->groupBy('user_id')
44
      ->get();
45
    
46
    // update statistics table

47
    foreach($posts as $post)
48
    {
49
      DB::table('users_statistics')
50
      ->where('user_id', $post->user_id)
51
      ->update(['total_posts' => $post->total_posts]);
52
    }
53
  }
54
}

Perintah Exec

Kita bisa mengatakan bahwa metode yang telah kita bahas sejauh ini khusus untuk aplikasi Laravel itu sendiri. Selain itu, Laravel juga memungkinkan Anda untuk menjadwalkan perintah shell sehingga Anda juga dapat menjalankan aplikasi eksternal.

Mari kita mulai lalui sebuah contoh cepat yang menunjukkan cara untuk mengambil cadangan dari database Anda setiap hari.

1
<?php
2
namespace App\Console;
3
4
use Illuminate\Console\Scheduling\Schedule;
5
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
6
7
class Kernel extends ConsoleKernel
8
{
9
  /**

10
   * Define the application's command schedule.

11
   *

12
   * @param  \Illuminate\Console\Scheduling\Schedule  $schedule

13
   * @return void

14
   */
15
  protected function schedule(Schedule $schedule)
16
  {
17
    // exec method

18
    $host = config('database.connections.mysql.host');
19
    $username = config('database.connections.mysql.username');
20
    $password = config('database.connections.mysql.password');
21
    $database = config('database.connections.mysql.database');
22
    
23
    $schedule->exec("mysqldump -h {$host} -u {$username} -p{$password} {$database}")
24
      ->daily()
25
      ->sendOutputTo('/backups/daily_backup.sql');
26
  }
27
}

Ini jelas dari kode yang Anda perlu menggunakan exec method scheduler, dan Anda harus melewati command yang Anda ingin jalankan sebagai argumen pertama.

Selain itu, kami juga telah menggunakan method sendOutputTo yang memungkinkan Anda untuk mengumpulkan output perintah. Di sisi lain, ada method, emailOutputTo, yang memungkinkan Anda untuk email melakukan konten output!

Dan itu membawa kita ke akhir dari sebuah artikel. kenyataannya, kita baru saja menggali latar dari Laravel Scheduling API, dan banyak yang bisa ditawarkan dalam aplikasi nya.

Kesimpulan

Hari ini, kita melewati task scheduling API dalam Laravel web framework. Itu menarik untuk melihat bagaimana dengan mudah memungkinkan Anda untuk mengelola tugas-tugas yang perlu dijalankan secara berkala.

Di awal artikel, kita membahas cara menyiapkan scheduled tasks, dan berikut bahwa kami memperkenalkan cara Laravel untuk melakukannya. Di paruh kedua artikel, kita melewati beberapa contoh-contoh praktis untuk menunjukkan task scheduling konsep.

Saya berharap bahwa Anda menikmati artikel ini, dan Anda harus merasa lebih percaya diri tentang mengatur scheduled tasks di Laravel. Bagi Anda yang hanya akan mulai dengan Laravel atau mencari untuk memperluas pengetahuan Anda, situs, atau aplikasi dengan ekstensi, kami memiliki berbagai hal yang Anda dapat belajar di Envato Market.

Apa saja yang muncul dalam pikiran Anda, mari kita memulai percakapan menggunakan feed di bawah ini!