Bir kerede yalnızca bir wp_cron () çalıştığından nasıl emin olabilirim?


9

wp_cron()Aşağıdaki kod gibi yaklaşık 20 fonksiyonları var . Hemen hemen tüm cronslar saatlik olarak çalışır; birkaçı günlük.

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
}

Sunucu performansını artırmak ve barındırma şirketlerinden sunucu sınırı iletileri almaya devam etmemek için, belirli bir zamanda yalnızca bir cronun çalıştığından emin olmak istiyorum ... Bu mümkün mü?


Şu anda kabul edilen cevap harika, ama şu sorum var, bu yüzden bu soru için bir ödül kazanıyorum.

Lütfen önce kabul edilen cevabı okuyun.

Cron 1'in çalıştığını varsayalım, cron2 kodum hala 5 dakika içinde olduğumuz veya ilk cron hala wp_schedule_event( time(), 'hourly', 'my_task_hook' );çalıştığı için çalışmıyor , ancak cron2 için çalıştığım için WordPress'in cron2 çalışır olarak olduğunu düşünüyorum ..... Yani temelde kod Cron2 kodu asla çalıştırmak ..... Veya bir şey yanlış anladım?


Hayır, doğru anlıyorsunuz. Cevabınız için bazı çözümler ile cevabımı güncelleyeceğim ...
Krzysiek Dróżdż

Yanıtlar:


10

Evet mümkün...

Ve dürüst olmak gerekirse, bunu yapmak genellikle çok önemlidir ... WP Zamanlayıcı, cron görevleri uzun olduğunda bazen sorunlara neden olma eğilimindedir ...

Peki bu sorunu nasıl çözerim?

Semaforlar uygulamak için Geçici API'yi kullanıyorum ...

İşte kod:

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' );
}

Bu durumda neden geçici kullanıyorum? Çünkü:

  • Onlar WP'nin bir parçası.
  • Kullanımı kolay ve verimlidir.
  • Kilitlenmelere neden olmazlar. Diyelim ki cron görevim öldürülebilir (bazı hatalar meydana gelebilir veya çok uzun süre çalışır ve öldürülür, vb.). Bu durumda semaforu silmez, bu nedenle gelecekteki tüm görevler çalışmaz. Geçici sürelerin kullanılması bu sorunu çözer, çünkü geçici bir süre sonra silinir.

Ve eğer yapılacak birçok farklı eylem varsa?

Diyelim ki hiçbir zaman aynı anda çalışmaması gereken birçok farklı cron görevi var, ama yine de hepsinin çalışmasını istiyoruz ...

Çözümü semaforla kullanırsak ve tüm bu görevler için yalnızca bir semafor kullanırsak, bazıları asla çalışmayabilir. Öyleyse ne yapmalı?

Bu durumda düşüncelerinizi değiştirmelisiniz. Bazı bağımsız görevleriniz yok, ancak yapacak bir görev kuyruğunuz var. Yani onu bu şekilde uygulamalısınız.

Yani:

  1. Bir tür kuyruk eklersiniz (bir dizi kullanabilir ve seçenek olarak depolayabilir veya özel bir DB tablosu ekleyebilirsiniz).
  2. Sıraya görev eklemek için şu anda WP cron saatlik etkinliğinizi kullanırsınız.
  3. Daha sık çalışan ikinci WP cron görevlerini eklersiniz ve görevleri kuyruktan birer birer "yiyor". Bu "yiyici" görev, aynı anda yalnızca bir görevin çalışmasını sağlamak için semafor kullanmalıdır.

Teşekkürler, ama üzgünüm, daha önce hiç geçici kullanmadım ... Ama kodu anlayabiliyorum. Geçici süreyi kullanarak sildiğiniz için neden geçici için 5 dakika ayarladınız delete_transient(). O zaman önemli mi? Demek istediğim hangi kez koyduğunuzda set_transient, işim bittikten hemen sonra siliniyor ... Öyleyse neden zaman var?
Ben En Aptal

Çünkü bazı hatalar meydana gelebilir. Son mermi noktasına bir bakın.
Krzysiek Dróżdż

Teşekkürler, harika ... Sadece bir soru. Anladığım kadarıyla, my_task_function_semaphoregeçici adı olarak kullanırsam , diğer tüm cronsları aynı ada mı kullanmalıyım?
Ben En Aptal

@IamtheMostStupidPerson Bu, elde etmek istediğiniz şeye bağlıdır ... Belirli bir anda yalnızca bir görev çalışması gerekiyorsa, evet - tüm görevler semaforla aynı geçici adı kullanmalıdır
Krzysiek Dróżd

1
Gearman gibi Job Queue araçlarıyla benzer şeyler yaptım. Bu uygulama yardımcı olabilir: github.com/10up/WP-Minions
Fayaz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.