WP Cron Zaman Aştığında Çalışmıyor


16

Amaç

wp_schedule_single_event( )Kullanıcı bir form gönderdikten 8 dakika sonra bana e-posta gönderen tek bir etkinliği yürütmek için kullanmak istiyorum .

Sorun

Aşağıdaki kod benim functions.php:

function nkapi_send_to_system( $args ) {
  wp_mail( 'xxx', 'xxx', $args );
}

add_action( 'nkapi_send', 'nkapi_send_to_system' );

function schedule_event( $id ) {
  wp_schedule_single_event( current_time( 'timestamp' ) + 480, 'nkapi_send', array( $id ) );
}

Ve aşağıdaki kodu aramak için kullanılır schedule-event:

schedule_event( $_SESSION['insert_id'] ); // the $_SESSION var contains an INT

8 dakikadan fazla bekledikten sonra gelen kutumda bir e-posta yoktu.

Ne denedim

Eklenti Çekirdek Kontrolü ile cron işlerinin planlandığını görmek mümkündür.

Çekirdek Kontrol ekranı

Birkaç değişiklikten sonra onları oldukça düzeltmeyi başardım ve daha iyisi, "Şimdi Çalıştır" tuşuna bastığımda, aslında gelen kutuma bir e-posta alıyorum.

Ama 8 dakika sonra sitemi ziyaret ettiğimde neden cronlar çalışmıyor? Bu kodda yanlış olan ne olabilir? WP Cron'u ilk kez kullandığımı söylemeliyim.

Daha çok denedim

Vancoder id yorumundan sonra ben doğrudan aşağıdaki kodu koyarsanız kodun çalışıp çalışmadığını test etmeye karar verdi functions.php:

function schedule_event( $id ) {
  wp_schedule_single_event( time(), 'nkapi_send', array( $id ) );
}

if ( isset( $_SESSION['insert_id'] ) ) {
  if ( ! array_key_exists( 'insert_scheduled', $_SESSION ) || $_SESSION['insert_scheduled'] != $_SESSION['insert_id'] ) {
    schedule_event( $_SESSION['insert_id'] );
    $_SESSION['insert_scheduled'] = $_SESSION['insert_id'];
  }
}

Bu kodun dezavantajı, kullanıcının bu kod yürütülmeden önce başka bir sayfaya gitmesi gerektiğidir. Ama diğer taraftan, bu da işe yaramıyor, bu yüzden ilk sorunum olmayacak ...


1
Nerede ve nasıl schedule_event( $_SESSION['insert_id'] );kovulur?
vancoder

Kısa kod, sayfada ayrı bir dosya (içinde form bulunan) içerir, bu form yayınlandığında sayfa yeniden yüklenir, aynı dosya çalıştırılır schedule_event( ), kısayol tarafından yüklenen dahil edilen dosyanın üstünde diyelim.
Ocak'ta Mike Madern

Do herhangi crons işi? wp_version_check vb?
vancoder

Ben alamadım herhangi çalışmaya crons. Bunun sorunu ne olabilir?
Mike Madern

Onaylamak için - çekirdek cron işleri bile başarısız mı?
vancoder

Yanıtlar:


8

Öncelikle, herhangi bir önbellek eklentisinin etkin olmadığını doğrulayabilir misiniz? Önbellek eklentileri, ziyaretçilerinize canlı bir sayfa değil, sayfanızın önbelleğe alınmış bir sürümü sunulduğu için cron işlerine müdahale edebilir.

Etkinleştirilmiş bir önbellek eklentiniz varsa, sayfalarınızdan birini seçebilir, önbelleğe alma eklentisinin ayarlarına o sayfayı ekleyerek önbelleğe alınmamasını sağlayabilirsiniz.

Ardından, her birkaç dakikada bir bu sayfayı ziyaret edecek bir cron işi (paylaşılan bir barındırma ortamındaysanız cpanel veya VPS / adanmış bir sunucu ise terminalden) kullanarak manuel olarak oluşturmanız gerekir.

Umarım bu yardımcı olur!


Etkin bir önbellek eklentisi var! W3 Toplam Önbellek kesin
Mike Madern

14

İlk olarak, özel cron iş programlarınızı tanımlayın.

add_filter('cron_schedules', array($this, 'cron_schedules'));

public function cron_schedules($schedules){
    $prefix = 'cron_';// Avoid conflict with other crons. Example Reference: cron_30_mins
    $schedule_options = array(
        '30_mins' => array(
            'display' => '30 Minutes',
            'interval' => '1800'
        ),
        '1_hours' => array(
            'display' => 'Hour',
            'interval' => '3600'
        ),
        '2_hours' => array(
            'display' => '2 Hours',
            'interval' => '7200'
        )
    );
    /* Add each custom schedule into the cron job system. */
    foreach($schedule_options as $schedule_key => $schedule){
        $schedules[$prefix.$schedule_key] = array(
            'interval' => $schedule['interval'],
            'display' => __('Every '.$schedule['display'])
        );
     }
     return $schedules;
}

Etkinliği nerede ve ne zaman planlayacağınıza karar vermeniz gerekir.

Aşağıda, özel bir sınıf yöntemine çağrı yapan örnek bir kod snippet'i verilmiştir:

$schedule = $this->schedule_task(array(
    'timestamp' => current_time('timestamp'), // Determine when to schedule the task.
    'recurrence' => 'cron_30_mins',// Pick one of the schedules set earlier.
    'hook' => 'custom_imap_import'// Set the name of your cron task.
));

Gerçekte etkinliği planlayan kod:

private function schedule_task($task){
    /* Must have task information. */
    if(!$task){
        return false;
    }
    /* Set list of required task keys. */
    $required_keys = array(
        'timestamp',
        'recurrence',
        'hook'
    );
    /* Verify the necessary task information exists. */
    $missing_keys = array();
    foreach($required_keys as $key){
        if(!array_key_exists($key, $task)){
            $missing_keys[] = $key;
        }
    }
    /* Check for missing keys. */
    if(!empty($missing_keys)){
        return false;
    }
    /* Task must not already be scheduled. */
    if(wp_next_scheduled($task['hook'])){
        wp_clear_scheduled_hook($task['hook']);
    }
    /* Schedule the task to run. */
    wp_schedule_event($task['timestamp'], $task['recurrence'], $task['hook']);
    return true;
}

Şimdi, tek yapmanız gereken özel cron görevinizin adını aramak. Bu örnekte cron görev adı custom_imap_import.

add_action('custom_imap_import', array($this, 'do_imap_import'));

public function do_imap_import(){
    // .... Do stuff when cron is fired ....
}

Yani bu örnekte, $this->do_imap_import();her 30 dakikada bir çağrılır (web sitenize yeterli trafiğiniz olduğu varsayılarak).


notlar

Cron'unuzun doğru zamanda ateş etmesi için bir sayfa ziyareti gerektirir.

Örnek: 30 dakikalık aralıklarla bir görev planladıysanız, ancak kimse sitenizi 4 saat boyunca ziyaret etmediyse, 4 saat sonra sitenize gelene kadar cron işiniz tetiklenmeyecektir. Eğer gerçekten gerçekten her 30 dakikada bir görev gerekiyorsa, o zaman web sitenizi istenen aralıklarla ziyaret etmek için web barındırma sağlayıcınız aracılığıyla meşru bir cron işi kurmak için tavsiye edilir.

WordPress cron işleri web sitenizi yavaşlatmaz!

Belki cron betiğinin yürütülmesi uzun sürerse, ziyaretçilerin betiğin yürütülmesini beklemek zorunda kalacağını düşünüyorsunuzdur. Hayır! Bu nasıl mümkün olabilir? wp-cron.phpDosyaya bakarsanız bir satır bulacaksınız

ignore_user_abort(true);

php.iniSiteyi / komut dosyasını yüklemeyi durdurursanız komut dosyasının yürütülmesini durdurmayacağını ayarlayan bir yapılandırmadır.

wp-includes/cron.phpDosyaya bakarsanız şöyle bir satır bulacaksınız:

wp_remote_post( $cron_url, 
array('timeout' => 0.01,
 'blocking' => false, 
 'sslverify' => apply_filters('https_local_ssl_verify', true)) );

Araçlarla Yani WordPress sonra iptal edecek ancak ayarlamış gibi yürütme tetiklemek için sadece 0.01 saniye bekleyecek ignore_user_abortkadar truekomut yürütme edilecektir. Bu işlevsellik, WordPress cron işlerinde büyük komut dosyaları yürütmek için büyük bir avantajdır.

Yardım için mevcut işlevler:


6
Bu, görebildiğim kadarıyla asıl soruya cevap vermeyen oldukça kapsamlı bir yanıttır - bu yüzden zamanlanan tüm görevler (temel görevler dahil) başarısız olur.
vancoder

Bu cevap, kullanıcıyı WordPress cron görevlerini doğru bir şekilde anlamak ve planlamak için doğru yönde yönlendirmektir.
Michael Ecklund

4
Bu kesinlikle bana WordPress ile cron programları anlamak çok yardımcı oldu
Mike Madern

2
Michael, daha sık cevap vermelisin. Harika bir +1
kaiser

1
Sanırım WP_CronWP'nin geri kalanı gibi kaputun altında GMT kullanıyor, time()bunun yerine ilk etkinliği planlamak daha iyi olurdu current_time().
Ian Dunn

3

WordPress Cron görevleri zamanlamanıza izin verir, ancak yalnızca siteye bir istek varsa çalıştırılır. WordPress'in aldığı her istek için, işlenecek cron işleri olup olmadığını kontrol eder ve eğer öyleyse /wp-cron.php?doing_wp_cronişi işlemek için senkronize olmayan bir istekte bulunur . Bir işin zamanlanmış başlangıcı istek olmadan geçerse, cron işlemi başlatılmaz.

Zamanlanmış işlerinizi görebildiğiniz ve çalıştırabildiğiniz için, özellikle bir önbellek eklentisi kullanıyorsanız, cron işinin başlatılmasını tetikleyen herhangi bir istek olmayabilir. Bunu daha düzenli bir zamanlamaya aktarmak için en iyi seçenek WordPress'te varsayılan kontrolü devre dışı bırakmak ve kullanmaktır crontab.

İlk olarak varsayılan kontrolü devre dışı bırakmak için (istemci tarafında performans konusunda biraz yardımcı olabilir) aşağıdakileri ekleyin wp-config.php:

// Disable default check for WordPress cron jobs on page loads
define( 'DISABLE_WP_CRON', true );

Daha wp-cron.phpsonra, arka uçtaki herhangi bir işi işlemek için sayfayı dakikada bir kez getirmek için bir görev oluşturursunuz , komut satırından girin crontab -eve ardından aşağıdakine benzeyen bir satır ekleyin:

*/1 * * * * /usr/bin/curl --silent http://example.com/wp-cron.php?doing_wp_cron=$(date +\%s.\%N) >/dev/null 

2
Doing_wp_cron'a bir değer vermezseniz, bu işlerin bazen iki kez yürütülmesine neden olma olasılığı yüksektir. doing_wp_cron=$(date +\%s.\%N)Bunu önlemek için kullanın .
Alexander Garden

0

Yapılandırmanızda DISABLE_WP_CRON öğesinin ayarlanmadığından emin olun.

Başarısız olursa, tüm eklentileri devre dışı bırakmayı deneyin (çekirdek kontrolü hariç - wp-crontrol kullanacak olsam da) ve temel işlerinizin işe yarayıp yaramadığını görün. Eğer öyleyse, bir yerde eklenti paraziti yaşıyorsunuz.

Benzer şekilde, standart yirmi bir şey temasına geçmeyi deneyin.

Bunların hiçbiri herhangi bir fark yaratmazsa, bu bir barındırma sorunu olabilir.


Ben sahip olmayan DISABLE_WP_CRONbenim, set wp-config.php, ben daha fazla şeyler deneyeceğim ve daha sonra gel
Mike MADERN

0

Wordpress'i gizleyen herhangi bir eklentiyi kontrol edin.

Sorunun bu olup olmadığını nasıl görebilirim?

  1. Http (s): //yoursite.com/wp-cron.php adresine gidin. Boş bir sayfa görmelisiniz. Tamamen boş bir tane.
  2. Ayrıca bir cron iş yöneticisinde "Sonraki yürütme" altında bir zaman görmelisiniz: Cron işi zamanlandı - wp-cron.php düzgün çalışıyorsa (sadece "Kuyrukta" metni değil - belirli bir süre - bazı girişler için "Kuyrukta" bazen sorun yok, ama tek şey buysa görüyorsunuz -> cronunuz çalışmıyor.)

+1. "Cron'un çalışıp çalışmadığını kontrol edin" gibi eklentilere inanmayın - örneğin WP Cron durum denetleyicisi eklentisi, cronun çalıştığını gösterdi. Ama aslında olmadı. Her ne gösterirse - bu eklentiye değil gözlerine inan!

Sonuç: 404 hatası ise - o zaman a) diğerlerinin önerdiği gibi eklentileri önbelleğe almakla kalmaz b) aynı zamanda Wordpress'i gizleyen eklentileri de kapatır.

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.