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