Bài viết Câu hỏi About RongvangIT
profile Pic
0
0

Đăng ngày:

  75 Lượt xem

【Laravel】Thiết lập laravel schedule tự động chạy job

Cron JobLaravel 8

Giới thiệu

Khi bạn muốn thực hiện các xử lý định kỳ như hàng ngày hoặc hàng tháng vào buổi tối, bạn có thể dễ dàng triển khai chúng bằng cách sử dụng lệnh tùy chỉnh của Laravel và lịch trình task. Dưới đây là tóm tắt của tôi sau khi tìm hiểu cách thực hiện điều này.

Thường, khi thực hiện các xử lý định kỳ trên hệ điều hành dạng Linux, bạn sẽ thêm mục cron cho mỗi task để thực hiện chúng tự động. Khi sử dụng lịch trình task của Laravel, bạn cũng cần sử dụng cron hoặc một phương tiện tương tự để thực hiện task, nhưng chỉ cần thêm một mục cron duy nhất.

Lưu ý: Tôi sử dụng Laravel phiên bản 8 trong bài viết này.

Hướng dẫn

Luồng task tổng quan như sau:

  1. Tạo một tệp lệnh hàng loạt (lệnh tùy chỉnh).
  2. Định nghĩa lịch trình task.
  3. Đăng ký vào cron hoặc phương tiện tương tự để thực hiện tự động.

Hãy đi vào chi tiết từng bước.

Bước 1: Tạo và chỉnh sửa tệp lệnh hàng loạt

Tạo tệp

Đầu tiên, chạy lệnh sau để tạo tệp lệnh hàng loạt (lệnh tùy chỉnh):

php artisan make:command ClassName

// Ví dụ (được trích từ Readouble)
php artisan make:command SendEmails

Khi chạy lệnh này, tệp sẽ được tạo trong thư mục app/Console/Commands.

Nội dung tệp khi mới tạo có dạng như sau:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class SendEmails extends Command
{
    protected $signature = 'command:name';
    protected $description = 'Command description';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        return 0;
    }
}

Nội dung tệp

  • $signature: Tên và chữ ký của lệnh khi chạy artisan.
  • $description: Mô tả của lệnh.
  • construct: Nội dung được thực hiện khi lớp được tạo. Bạn có thể thêm bất kỳ xử lý nào cần thiết trước khi chạy phương thức handle.
  • handle: Thực hiện xử lý thực tế của lệnh.

Chỉnh sửa nội dung tệp

Hãy thử chỉnh sửa như sau:

/**
 * The name and signature of the console command.
 *
 * @var string
 */
protected $signature = 'command:sendMail';

/**
 * The console command description.
 *
 * @var string
 */
protected $description = '(test) send mail';

// (Giữa)

/**
 * Execute the console command.
 *
 * @return int
 */
public function handle()
{
    echo 'Send an Email!!';
}

Kiểm tra và chạy lệnh

Chạy php artisan list để kiểm tra xem lệnh đã được đăng ký thành công hay không:

php artisan list

// (Giữa)
command
  command:sendMail     (test) send mail

Chạy lệnh thực tế để kiểm tra kết quả:

php artisan command:sendMail

// Kết quả đầu ra
Send an Email!!

Truyền tham số cho lệnh hàng loạt

Bạn cũng có thể truyền tham số cho lệnh hàng loạt:

Cách khai báo tham số trong signature:

// Khai báo trong signature
protected $signature = 'command:sendMail {name}';

// Đối với tham số có thể làm cho nó trở nên tùy chọn
protected $signature = 'command:sendMail {name?}';


// Nhận tham số trong phương thức handle
public function handle()
{
    $name = $this->argument('name');

    echo "Send an Email to {$name}!!";
}

Khi chạy lệnh, bạn cần truyền giá trị tham số:

php artisan command:sendMail taro

// Kết quả thực thi
Send an Email to taro!!

Bước 2: Định nghĩa lịch trình task

Để có thể thực hiện lệnh hàng loạt được tạo ở Bước 1 đúng vào thời điểm mong muốn, bạn cần đăng ký nó trong lịch trình task.

Nội dung lịch trình task được đặc tả trong tệp app/Console/Kernel.php:

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        //
    ];

    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')->hourly();
        $schedule->command('command:sendMail')->monthlyOn(1, '09:00');
    }

    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

Trong ví dụ trên, tôi đã đặt lịch trình để thực hiện lệnh hàng loạt vào lúc 9 giờ sáng ngày 1 mỗi tháng.

Có nhiều tùy chọn khác cho thời gian thực hiện task và nhiều hơn nữa. Bạn có thể tham khảo thêm trong tài liệu của Laravel Laravel 8.x Artisan Console.

Đăng ký task trong cron

Sau khi đã định nghĩa task trong Laravel, bạn chỉ cần đăng ký nó trong cron hoặc sử dụng các công cụ tương tự trên các dịch vụ như AWS để đảm bảo rằng task sẽ được thực hiện đúng theo lịch trình đã đặt.

Ví dụ đối với AWS, hãy đi đến terminal, ssh vào server của bạn, cd vào dự án của bạn và chạy lệnh sau đây:

crontab -e

Thao tác này sẽ mở file Crontab của server, dán mã bên dưới vào tệp, lưu và sau đó thoát.

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

cronjob.png

Trong đó:

  • Ký hiệu * * * * * được dùng để chỉ định thời gian chạy cronjob, bạn có thể tham khảo chi tiết tại Cron job Wikipedia
  • /path-to-your-project là đường dẫn tới project của bạn

Lại nữa, trong trường hợp đăng ký task thất bại, có 2 khả năng dưới

  1. Đường dẫn tới project của bạn chưa fullpath.
  2. Đường dẫn chỉ định tới php artisan đang bị sai. Hãy chạy lệnh which php để tìm đường dẫn tới artisan ( có lẽ là /opt/bitnami/php/bin/php hoặc đường dẫn tương tự).

Khi đó bạn có thể viết lại lệnh đăng ký task trong cron như sau:

* * * * * cd /opt/bitnami/apache2/htdocs/your-project && /opt/bitnami/php/bin/php artisan schedule:run >> /dev/null 2>&1

Kết luận

Sử dụng lệnh tự tạo của Laravel không chỉ giúp triển khai các xử lý tự động như xử lý hàng loạt mà còn mang lại tiện ích khi bạn muốn chạy lệnh thủ công một cách linh hoạt.

Tôi đã học được rất nhiều về cron trong lần đầu tiên sử dụng nó trong bài viết này. Tôi muốn tìm hiểu thêm về cách nó được sử dụng trong thực tế và ứng dụng nó trong những tình huống khác nhau.

Bài viết tham khảo

https://readouble.com/laravel/8.x/ja/artisan.html

https://readouble.com/laravel/8.x/ja/scheduling.html

https://www.rail-c.com/laravel%E3%81%AE%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A7%E5%AE%9A%E6%9C%9F%E5%87%A6%E7%90%86%E3%82%92%E8%87%AA%E5%8B%95%E5%AE%9F%E8%A1%8C/

https://syoblog.com/laravel-batch/

https://codelikes.com/laravel-batch-command/

Bình luận

Copy link

Ngoài việc đăng ký schedule định kỳ chạy command, bạn cũng có thể đăng ký schedule định kỳ chạy các lệnh update DB bằng cách sử dụng $schedule->call như dưới.

class Kernel extends ConsoleKernel
{
    /**
     * 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();
    }
}

Tham khảo https://laravel.com/docs/8.x/scheduling#defining-schedules

profile Pic
0
Sign up for free and join this conversation.
Sign Up
If you already have a RongvangIT account Login
Danh sách thư mục
Bắt đầu ngay với RồngVàngIT - nền tảng chia sẻ kiến thức lập trình tuyệt vời cho kỹ sư Việt Nam!

Hãy đăng nhập để sử dụng hàng loạt các chức năng tuyệt vời của RồngVàngIT !

  1. 1. Bạn sẽ nhận được các bài viết phù hợp bằng chức năng theo dõi tag và người dùng.
  2. 2. Bạn có thể đọc lại các thông tin hữu ích bằng chức năng lưu trữ nội dung.
  3. 3. Chia sẻ kiến thức, đặt câu hỏi và ghi lại quá trình trưởng thành của mình cùng RồngVàngIT !
Tạo tài khoản Đăng nhập
profile Pic