คอมโพเนนต์งานทำเวลาตามที่กำหนด

workerman/crontab

คำอธิบาย

workerman/crontab เหมือนกับ crontab ใน Linux แต่ต่างกันที่ workerman/crontab รองรับการตั้งเวลาในหน่วยวินาที

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

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

ลิงก์โครเจ็ค

https://github.com/walkor/crontab

การติดตั้ง

composer require workerman/crontab

การใช้งาน

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

<?php
namespace 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";
        });

        // ทำงานทุกวินาทีที่ 1
        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";
        });
    }
}

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

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

return [
    .... ค่ากำหนดอื่นๆ ข้างล่างนี้เลย....

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

ขั้นตอนที่ 3: รีสตาร์ทเว็บแมน

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

คำอธิบาย

crontab ไม่ใช่การทำงานแบบไม่พร้อม (asynchronous) เช่นถ้ามี task ที่ตั้งเวลา 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 กรุณาอ่านเพิ่มเติมที่ โปรเซสที่กำหนดเอง