Làm thế nào để đảm bảo rằng chỉ có một wp_cron () chạy cùng một lúc?


9

Tôi có khoảng 20 wp_cron()chức năng như mã sau đây. Hầu như tất cả các con chuột chạy hàng giờ; một số ít là hàng ngày.

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() {
  //Complex Code
}

Để tăng hiệu suất máy chủ và để không tiếp tục nhận thông báo giới hạn máy chủ từ các công ty lưu trữ, tôi muốn đảm bảo rằng chỉ có một cron chạy tại một thời điểm nhất định ... Có thể không?


Câu trả lời được chấp nhận hiện tại là rất tốt, nhưng tôi có câu hỏi tiếp theo, đó là lý do tại sao tôi bắt đầu trả tiền cho câu hỏi này.

Xin vui lòng đọc câu trả lời được chấp nhận đầu tiên.

Giả sử Cron 1 chạy, Mã cron2 của tôi sẽ không chạy vì chúng tôi vẫn ở trong 5 phút hoặc cron đầu tiên vẫn chạy, nhưng vì wp_schedule_event( time(), 'hourly', 'my_task_hook' );chạy cho cron2 tôi nghĩ WordPress coi như cron2 chạy ..... Vì vậy, về cơ bản là mã mã cron2 không bao giờ chạy ..... Hoặc tôi có hiểu nhầm gì không?


Không, bạn hiểu nó một cách chính xác. Tôi sẽ cập nhật câu trả lời của tôi với một số giải pháp cho vấn đề của bạn ...
Krzysiek Dróżdż

Câu trả lời:


10

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ế:

  1. 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).
  2. 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.
  3. 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.

Cảm ơn, nhưng tôi xin lỗi, tôi chưa bao giờ sử dụng tạm thời trước đây ... Nhưng tôi đang cố gắng để hiểu mã. Tại sao bạn lại đặt 5 phút cho thoáng qua vì bạn xóa tạm thời bằng cách sử dụng delete_transient(). Vì vậy, thời gian có vấn đề? Ý tôi là bất cứ khi nào bạn đặt set_transient, nó sẽ bị xóa ngay sau khi công việc của tôi hoàn thành ... Vậy tại sao lại có thời gian?
Tôi là người ngu ngốc nhất

Bởi vì một số lỗi có thể xảy ra. Hãy nhìn vào điểm đạn cuối cùng.
Krzysiek Dróżdż

Cảm ơn, tuyệt vời ... Chỉ một câu hỏi. Theo tôi hiểu, nếu tôi sử dụng my_task_function_semaphorelàm tên cho thoáng qua, tôi phải sử dụng tất cả các con chuột khác để cùng tên?
Tôi là người ngu ngốc nhất

@IamtheMostStoolPerson, nó phụ thuộc vào những gì bạn muốn đạt được ... Nếu chỉ có một nhiệm vụ nên hoạt động trong thời điểm nhất định, thì có - tất cả các nhiệm vụ nên sử dụng cùng một tên tạm thời như semaphore
Krzysiek Dróżdż

1
Tôi đã làm những điều tương tự với các công cụ Hàng đợi Công việc như Gearman. Việc triển khai này có thể giúp: github.com/10up/WP-Minions
Fayaz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.