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 สามารถดูได้ที่ การสร้างโปรเซสที่กำหนดเอง