Ya, itu mungkin ...
Dan sejujurnya, seringkali sangat penting untuk melakukan ini ... WP Scheduler terkadang cenderung menyebabkan masalah, ketika tugas cron panjang ...
Jadi bagaimana saya mengatasi masalah ini?
Saya menggunakan Transients API untuk mengimplementasikan semaphores ...
Berikut kodenya:
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' );
}
Mengapa saya menggunakan transien dalam kasus ini? Karena:
- Mereka adalah bagian dari WP.
- Mereka mudah digunakan dan efisien.
- Mereka tidak akan menyebabkan kebuntuan. Katakanlah tugas cron saya dapat terbunuh (beberapa kesalahan dapat terjadi, atau berjalan terlalu lama dan terbunuh, dan sebagainya). Dalam kasus seperti itu tidak akan menghapus semaphore, jadi semua tugas di masa depan tidak akan berfungsi. Menggunakan transien memecahkan masalah ini, karena setelah beberapa saat transient akan dihapus.
Dan bagaimana jika ada banyak tindakan berbeda yang harus dilakukan?
Jadi katakanlah ada banyak tugas cron yang berbeda, yang seharusnya tidak pernah berjalan dalam waktu yang sama, tetapi kami masih ingin semuanya berjalan ...
Jika kami menggunakan solusi dengan semaphore dan hanya menggunakan satu semaphore untuk semua tugas ini, maka beberapa di antaranya mungkin tidak pernah berjalan. Lalu apa yang harus dilakukan?
Dalam hal demikian, Anda harus mengubah pemikiran Anda. Anda tidak memiliki beberapa tugas independen, tetapi ada beberapa tugas yang harus dilakukan. Jadi Anda harus menerapkannya dengan cara ini.
Begitu:
- Anda menambahkan beberapa jenis antrian (Anda dapat menggunakan array dan menyimpannya sebagai opsi, atau menambahkan tabel DB khusus).
- Anda menggunakan acara per jam WP cron Anda saat ini untuk menambahkan tugas ke antrian.
- Anda menambahkan tugas cron WP kedua yang berjalan jauh lebih sering dan "memakan" tugas dari antrian satu per satu. Tugas "pemakan" ini harus menggunakan semaphore untuk memastikan bahwa hanya satu tugas yang berjalan pada suatu saat.