crontab คอมโพเนนต์กำหนดเวลา

คำอธิบาย

workerman/crontab คล้ายกับ crontab ของลินุกซ์ แต่แตกต่างตรงที่ workerman/crontab รองรับการกำหนดเวลาในระดับวินาที

คำอธิบายเวลาคือ:

0   1   2   3   4   5
|   |   |   |   |   |
|   |   |   |   |   +------ วันในสัปดาห์ (0 - 6) (อาทิตย์=0)
|   |   |   |   +------ เดือน (1 - 12)
|   |   |   +-------- วันของเดือน (1 - 31)
|   |   +---------- ชั่วโมง (0 - 23)
|   +------------ นาที (0 - 59)
+-------------- วินาที (0-59)[สามารถละได้ ถ้าไม่มีวินาทีส่วนนั้น จะมีความละเอียดต่ำสุดเป็นนาที]

ที่อยู่โปรเจกต์

https://github.com/walkor/crontab

การติดตั้ง

composer require workerman/crontab

การใช้งาน

ขั้นตอนที่หนึ่ง: สร้างไฟล์โปรเซส app/process/Task.php

<?php
namespace app\process;

use Workerman\Crontab\Crontab;

class Task
{
    public function onWorkerStart()
    {

        // รันทุกๆ วินาที
        new Crontab('*/1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // รันทุกๆ 5 วินาที
        new Crontab('*/5 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // รันทุกๆ นาที
        new Crontab('0 */1 * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // รันทุกๆ 5 นาที
        new Crontab('0 */5 * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // รันในวินาทีแรกของแต่ละนาที
        new Crontab('1 * * * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

        // รันเวลา 7:50 น. ของทุกวัน หมายเหตุ: ที่นี่ละวินาทีไม่ได้
        new Crontab('50 7 * * *', function(){
            echo date('Y-m-d H:i:s')."\n";
        });

    }
}

ขั้นตอนที่สอง: กำหนดไฟล์โปรเซสให้ทำงานพร้อมกับ webman

เปิดไฟล์การตั้งค่า config/process.php และเพิ่มการกำหนดค่าดังนี้

return [
    ....การตั้งค่าอื่นๆ ที่นี่ละไว้....

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

ขั้นตอนที่สาม: รีสตาร์ท webman

หมายเหตุ: งานกำหนดเวลาจะไม่ถูกดำเนินการทันที ทุกงานจะเริ่มนับเวลาในนาทีถัดไป

คำอธิบาย

crontab ไม่ได้ทำงานแบบอะซิงโครนัส เช่น ในโปรเซสหนึ่งที่มีการตั้งค่า A และ B ซึ่งทั้งสองจะรันงานทุกๆ วินาที แต่ถ้างาน A ใช้เวลานาน 10 วินาที งาน B ต้องรอให้งาน A เสร็จสิ้นก่อนจึงจะดำเนินการ เกิดความล่าช้าในงาน B
หากธุรกิจต้องการความละเอียดของช่วงเวลา ควรนำงานที่มีความละเอียดมากไปทำงานในโปรเซสแยกเพื่อไม่ให้งานอื่นๆ ส่งผลกระทบ。例如 config/process.php สามารถตั้งค่าดังนี้

return [
    ....การตั้งค่าอื่นๆ ที่นี่ละไว้....

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

นำงานที่มีความไวต่อเวลาไปไว้ใน process/Task1.php และงานอื่นๆ ไว้ใน process/Task2.php

ข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่า config/process.php สามารถดูได้ที่ การสร้างโปรเซสที่กำหนดเอง