Tìm hiểu về Task Scheduling trong Laravel

Tìm hiểu về Task Scheduling trong Laravel

1. Giới thiệu

  • Hôm nay mình xin giới thiệu về Task Scheduling trong Laravel. Như các bạn biết trong quá trình xây dựng website của chúng ta, đôi lúc chúng ta cần lên kế hoạch hay dự định cho một công việc hay nhiệm vụ chạy vào một khoảng thời gian nhất định có thể là trong ngày, trong tuần...Nếu như trong những phiên bản Laravel cũ thì chúng ta phải định nghĩa nhiều con Cron, mỗi con đảm nhận một chức năng là thực hiện một schedule mà bạn mong muốn hệ thống chạy. Và cho đến phiên bản Laravel hiện tại thì công việc này đã được cải thiện hơn nhiều, với việc sử dụng schedule của Laravel. Bây giờ chúng ta bắt đầu tìm hiểu nó nhé. Chúng ta sẽ mỗi phút thêm một bản ghi vào bảng posts trong database.

2.Cài đặt

  • Cài đặt project: $ composer create-project laravel/laravel cronjob
  • Setup cơ sở dữ liệu
    file .env trong project thiết lập các thông tin để kết nối đến csdl của bạn
 DB_CONNECTION=mysql 
 DB_HOST=127.0.0.1 
 DB_PORT=3306 
 DB_DATABASE=databasename
 DB_USERNAME=username
 DB_PASSWORD=password
  • Tạo table posts: php artisan make:migration create_posts_table
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('depscription');
            $table->text('content');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}
  • Sau đó ta chạy câu lệnh: php artisan migrate để tạo table trong database

3. Tạo cronjob

  • Đầu tiên chúng ta tạo Command bằng câu lệnh sau: php artisan make:command PostCommand
  • file PostCommand sẽ được khởi tạo tại đường dẫn: app\Console\Commands\PostCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class PostCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:auto-create-new-post';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'create post';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        DB::table('posts')->insert([
            'title' => 'bai viet 1',
            'content' => 'Noi dung cua bai viet',
            'depscription' => 'Mo ta ngan cua bai viet'
        ]);
    }
}
  • ở hàm handle chúng ta sẽ viết các phần xử lý ở đây (ở hàm này mình viết để tạo mới 1 bài viết)
  • Tiếp theo tại file Kernel.php với đường dẫn: app\Console\Kernel.php ta tiến hành lên để đăng ký để chạy job cho file PostCommand.php chúng ta vừa tạo ở trên như sau.
<?php

namespace App\Console;

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 = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')->hourly();
        $schedule->command('command:auto-create-new-post')->everyMinute()->withoutOverlapping();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}
  • Để chạy Cron ta chạy câu lệnh: php artisan schedule:work
  • Các bạn check trong database xem có bản ghi được tạo trong bảng posts chưa nhé

4. Kết Luận

  • Qua một ví dụ đơn giản như trên thì mình mong rằng phần kiến thức mình chia sẻ sẽ giúp cho các bạn phần nào mường tượng ra cách Schedule trong Laravel nó hoạt động như thế nào. Cảm ơn các bạn đã đọc bài viết của mình.