Bộ lập lịch crontab

Mô tả

workerman/crontab tương tự như crontab của Linux, khác biệt là hỗ trợ lập lịch theo giây.

Định dạng thời gian:

0   1   2   3   4   5
|   |   |   |   |   |
|   |   |   |   |   +------ day of week (0 - 6) (Sunday=0)
|   |   |   |   +------ month (1 - 12)
|   |   |   +-------- day of month (1 - 31)
|   |   +---------- hour (0 - 23)
|   +------------ min (0 - 59)
+-------------- sec (0-59)[Có thể bỏ qua, nếu không có vị trí 0 thì đơn vị nhỏ nhất là phút]

Địa chỉ dự án

https://github.com/walkor/crontab

Cài đặt

composer require workerman/crontab

Sử dụng

Bước 1: Tạo tệp tiến trình app/process/Task.php

<?php
namespace app\process;

use Workerman\Crontab\Crontab;

class Task
{
    public function onWorkerStart()
    {

        // Thực hiện mỗi giây
        new Crontab('*/1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Thực hiện mỗi 5 giây
        new Crontab('*/5 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Thực hiện mỗi phút
        new Crontab('0 */1 * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Thực hiện mỗi 5 phút
        new Crontab('0 */5 * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Thực hiện ở giây đầu tiên của mỗi phút
        new Crontab('1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // Thực hiện lúc 7:50 hàng ngày (vị trí giây được bỏ qua ở đây)
        new Crontab('50 7 * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

    }
}

Bước 2: Cấu hình tiến trình khởi động cùng webman

Mở tệp cấu hình config/process.php, thêm cấu hình sau:

return [
    ....Cấu hình khác, ở đây lược bỏ....

    'task'  => [
        'handler'  => app\process\Task::class
    ],
];

Bước 3: Khởi động lại webman

Chú ý: Công việc lập lịch không thực hiện ngay; tất cả bắt đầu đếm và thực hiện từ phút tiếp theo.

Giải thích

Crontab không phải bất đồng bộ. Ví dụ: trong một tiến trình task đặt hai bộ đếm A và B, cả hai đều thực hiện mỗi giây, nhưng nhiệm vụ A mất 10 giây thì B phải chờ A hoàn thành mới chạy được, gây trì hoãn cho B.
Nếu logic nhạy với khoảng thời gian, cần chạy các công việc lập lịch nhạy cảm thời gian trong tiến trình riêng để tránh bị ảnh hưởng. Ví dụ cấu hình config/process.php như sau:

return [
    ....Cấu hình khác, ở đây lược bỏ....

    'task1'  => [
        'handler'  => process\Task1::class
    ],
    'task2'  => [
        'handler'  => process\Task2::class
    ],
];

Đặt các công việc nhạy cảm thời gian vào process/Task1.php, các công việc khác vào process/Task2.php.

Chi tiết cấu hình config/process.php, xem Tiến trình tùy chỉnh.