Phải, có thể ...
Và thành thật mà nói, thường rất quan trọng để làm điều này ... Trình lập lịch WP đôi khi có xu hướng gây ra sự cố, khi các tác vụ cron dài ...
Vậy làm thế nào để tôi giải quyết vấn đề này?
Tôi sử dụng API khách hàng để triển khai semaphores ...
Đây là mã:
if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}
add_action( 'my_task_hook', 'my_task_function' );
function my_task_function() {
// if some other my_task is already running, stop
if ( get_transient( 'my_task_function_semaphore' ) ) return;
// set semaphore for 5 minutes
set_transient( 'my_task_function_semaphore', true, 5*60 );
// DO YOUR STUFF
delete_transient( 'my_task_function_semaphore' );
}
Tại sao tôi sử dụng tạm thời trong trường hợp này? Bởi vì:
- Chúng là một phần của WP.
- Chúng dễ sử dụng và hiệu quả.
- Họ sẽ không gây ra bế tắc. Giả sử nhiệm vụ cron của tôi có thể bị giết (một số lỗi có thể xảy ra hoặc nó chạy quá lâu và bị giết, v.v.). Trong trường hợp như vậy, nó sẽ không xóa semaphore, vì vậy tất cả các nhiệm vụ trong tương lai sẽ không hoạt động. Sử dụng tạm thời giải quyết vấn đề này, bởi vì sau một thời gian thoáng qua sẽ bị xóa.
Và nếu có nhiều hành động khác nhau để làm gì?
Vì vậy, hãy nói rằng có nhiều nhiệm vụ cron khác nhau, không bao giờ nên chạy cùng một lúc, nhưng chúng tôi vẫn muốn tất cả chúng chạy ...
Nếu chúng ta sử dụng giải pháp với semaphore và chỉ sử dụng một semaphore cho tất cả các nhiệm vụ này, thì một số trong số chúng có thể không bao giờ chạy. Vậy phải làm sao sau đó?
Trong trường hợp như vậy bạn nên thay đổi suy nghĩ của bạn. Bạn không có một số nhiệm vụ độc lập, nhưng một chuỗi các nhiệm vụ phải làm. Vì vậy, bạn nên thực hiện nó theo cách này.
Vì thế:
- Bạn thêm một số loại hàng đợi (bạn có thể sử dụng một mảng và lưu trữ dưới dạng tùy chọn hoặc thêm bảng DB tùy chỉnh).
- Bạn sử dụng sự kiện hàng giờ WP hiện tại của mình để thêm các tác vụ vào hàng đợi.
- Bạn thêm các tác vụ cron WP thứ hai chạy thường xuyên hơn và nó "ăn" các tác vụ từ hàng đợi từng cái một. Nhiệm vụ "ăn" này nên sử dụng semaphore để đảm bảo rằng chỉ có một nhiệm vụ chạy tại một thời điểm.