Thành phần tác vụ định kỳ crontab

Giới thiệu

workerman/crontab tương tự như crontab của linux, khác biệt là workerman/crontab hỗ trợ định kỳ theo giây.

Giải thích 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ó trường giây, thì độ phân giải thời gian tối thiểu 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 vào 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 lúc 7 giờ 50 phút mỗi ngày, lưu ý ở đây bỏ qua trường giây
        new Crontab('50 7 * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

    }
}

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

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

return [
    ....các cấu hình khác, bỏ qua ở đây....

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

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

Lưu ý:Các tác vụ định kỳ sẽ không ngay lập tức thực hiện, tất cả các tác vụ định kỳ sẽ bắt đầu đếm thời gian thực hiện từ phút tiếp theo

Giải thích

crontab không phải là bất đồng bộ, ví dụ như trong một tiến trình task cài đặt hai bộ hẹn giờ A và B, đều thực hiện mỗi giây một lần, nhưng nếu tác vụ A mất 10 giây, thì B sẽ cần phải chờ A thực hiện xong mới có thể thực hiện, dẫn đến việc B bị trì hoãn.
Nếu công việc nhạy cảm về khoảng thời gian, cần phải đặt các tác vụ định kỳ nhạy cảm vào một tiến trình riêng để chạy, tránh bị ảnh hưởng bởi các tác vụ định kỳ khác. Ví dụ cấu hình config/process.php như sau

return [
    ....các cấu hình khác, bỏ qua ở đây....

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

Đặt các tác vụ định kỳ nhạy cảm về thời gian vào process/Task1.php, các tác vụ định kỳ khác vào process/Task2.php

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