Bộ lập lịch crontab

workerman/crontab

Giới thiệu

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

Mô tả thời gian:

0   1   2   3   4   5
|   |   |   |   |   |
|   |   |   |   |   +------ ngày trong tuần (0 - 6) (Chủ nhật=0)
|   |   |   |   +------ tháng (1 - 12)
|   |   |   +-------- ngày trong tháng (1 - 31)
|   |   +---------- giờ (0 - 23)
|   +------------ phút (0 - 59)
+-------------- giây (0-59)[Có thể bỏ qua, nếu không có số 0, đơn vị thời gian nhỏ nhất sẽ 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 mới process/Task.php

<?php
namespace 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 mỗi 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 vào 7 giờ 50 phút hàng ngày, lưu ý ở đây bỏ qua đơn vị giâ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 chạy cùng với 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'  => process\Task::class
    ],
];

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

Chú ý: Công việc được lập lịch không sẽ thực hiện ngay lập tức, tất cả các công việc được lập lịch sẽ bắt đầu đếm thời gian từ phút tiếp theo.

Giải thích

Crontab không phải là không đồng bộ. Ví dụ, trong một tiến trình task, đặt hai viên đồng hồ 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ì nhiệm vụ B cần phải đợi cho đến khi nhiệm vụ A hoàn thành mới được thực hiện, dẫn đến việc trì hoãn thực hiện của nhiệm vụ B.
Nếu doanh nghiệp cảm thấy nhạy cảm với khoảng thời gian, cần đặt các công việc lập lịch nhạy cảm thời gian vào một tiến trình riêng biệt để chạy, ngăn không cho các công việc lập lịch khác ảnh hưởng. Ví dụ config/process.php thiết lập 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 lập lịch nhạy cảm thời gian vào tệp process/Task1.php, các công việc lập lịch khác vào process/Task2.php.

Thêm thông tin

Để biết thêm thông tin cấu hình config/process.php, vui lòng tham khảo Tiến trình tùy chỉnh