Her 5 dakikada bir işlev nasıl çalıştırılır?


15

Her 5 dakikada bir çalıştırılacak bir fonksiyonum var. Aşağıdaki kodeks referans verdim:

<?php wp_schedule_event(time(), 'hourly', 'my_schedule_hook', $args); ?> 

Bu işlevi ne zaman başlayacağımıza bakılmaksızın her 5 dakikada bir çalıştırmak istiyorum. Bunu nasıl yapabilirim?

Ayrıca kodeks, bir ziyaretçi siteyi ziyaret ettiğinde cron'un çalıştırılacağını söylüyor. Dakikada olduğu gibi cronu çalıştırmanın ve ziyaret beklemenin bir yolu var mı?

hadi aşağıdaki işlevi kullanıyorum bunu nasıl sonra her 5 dakikada bir çalıştırılmalıdır demek wp_schedule_event()ya wp_cron?

function run_evry_five_minutes(){
    // codes go here
}

Böyle kısa bir aralığa ve doğruluğa ihtiyacınız varsa, örneğin Linux cron veya 3. taraf cron hizmetlerine bakmanız daha iyi,
birgire

site yoğun trafik var .. bu yüzden zaman aralığını düşünmek gerek .. emin olun her 2 veya 3 dakikada bir tetiklenecektir .. müşteriler bunu tercih tercihfunctions.php
Foolish Coder

bir zamanlayıcı ile sunucu üzerinde çalışan bir şey olmadan bir php dosyasını tetiklemek mümkün değildir.
Andrew Welch

dosya? function.php içindeki bir işlevden bahsediyoruz
Foolish Coder

Ücretsiz bir izleme hizmetinin CRON'u tetikleyen ping olabileceğini düşünüyor musunuz? newrelic.com/server-monitoring
jgraup

Yanıtlar:


28

Cron_schedules ile yeni program saatleri oluşturabilirsiniz:

function my_cron_schedules($schedules){
    if(!isset($schedules["5min"])){
        $schedules["5min"] = array(
            'interval' => 5*60,
            'display' => __('Once every 5 minutes'));
    }
    if(!isset($schedules["30min"])){
        $schedules["30min"] = array(
            'interval' => 30*60,
            'display' => __('Once every 30 minutes'));
    }
    return $schedules;
}
add_filter('cron_schedules','my_cron_schedules');

Şimdi işlevinizi planlayabilirsiniz:

wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);

Yalnızca bir kez programlamak için bir işleve sarın ve çalıştırmadan önce kontrol edin:

$args = array(false);
function schedule_my_cron(){
    wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);
}
if(!wp_next_scheduled('my_schedule_hook',$args)){
    add_action('init', 'schedule_my_cron');
}

$ Args parametresine dikkat edin! $ Args parametresini wp_next_scheduled içinde belirtmemek, ancak wp_schedule_event için $ args parametresine sahip olmak, aynı olayın neredeyse sonsuz sayıda zamanlanmasına neden olur (yalnızca bir tane yerine).

Son olarak, çalıştırmak istediğiniz gerçek işlevi oluşturun:

function my_schedule_hook(){
    // codes go here
}

Her sayfa yüklendiğinde wp-cron'un zamanlamayı kontrol ettiğini ve zamanlanmış işleri çalıştırdığını belirtmenin önemli olduğunu düşünüyorum.

Yani, saatte yalnızca 1 ziyaretçisi olan düşük trafikli bir web siteniz varsa, wp-cron yalnızca bu ziyaretçi sitenize göz attığında (saatte bir kez) çalışır. Ziyaretçilerin saniyede bir sayfa istediği yüksek trafikli bir siteniz varsa, wp-cron her saniye tetiklenir ve sunucuda ekstra yüke neden olur.

Çözüm, wp-cron'u devre dışı bırakmak ve gerçek zamanlı bir cron işi ile en hızlı tekrarlanan zamanlanmış wp-cron işi zamanınızda (sizin durumunuzda 5 dakika) tetiklemektir.

Lucas Rolff sorunu açıklıyor ve çözümü ayrıntılı olarak veriyor.

Alternatif olarak, wp-cron'u devre dışı bırakmak ve gerçek bir cron işi ile tetiklemek istemiyorsanız, sitenizi sorgulamak (ve wp-cron'u tetiklemek) için her 5 dakikada bir UptimeRobot gibi ücretsiz bir 3. taraf hizmetini kullanabilirsiniz .


2

Siteniz yoğun trafik set_transient()alıyorsa, her 5 dakikada bir (yaklaşık olarak) çalıştırmak için kullanmayı deneyebilirsiniz , örneğin:

function run_every_five_minutes() {
    // Could probably do with some logic here to stop it running if just after running.
    // codes go here
}

if ( ! get_transient( 'every_5_minutes' ) ) {
    set_transient( 'every_5_minutes', true, 5 * MINUTE_IN_SECONDS );
    run_every_five_minutes();

    // It's better use a hook to call a function in the plugin/theme
    //add_action( 'init', 'run_every_five_minutes' );
}

Peki, er, evet
?!

evet., işe yaramıyor .. ben ettik kod aşağıdaki kullanılan functions.phpbir sayfanın ziyaret yapmak, bir güncelleme benim veritabanındaki bir tabloya yapılacaktır zaman .. function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }. Ancak DB tablosu 6 dakika sonra bile güncellenmez.
Aptal Kodlayıcı

Neden sizin için çalışmıyor bilmiyorum ama aslında sadece cron şeyleri kullanarak get_transient()/ set_transient()olmadan düşünmek çok daha mantıklı, çok daha basit, cevabı güncelleyecek ...
bonger

@bonger wp_schedule_event () için bu iyi bir alternatif mi?
Marko Kunic

@ MarkoKunić Dürüst olmayı bilmiyorum, denemedim ... sadece bir geçici çözüm olarak sunuldu, ancak denerseniz bize bildirin ...! (Johano Fierra'in cevabı iyi görünüyor wordpress.stackexchange.com/a/216121/57034 )
bonger

2

Her eklenti çağrısı yerine eklenti aktivasyonunda tetikleyebilirsiniz:

//Add a utility function to handle logs more nicely.
if ( ! function_exists('write_log')) {
    function write_log ( $log )  {
        if ( is_array( $log ) || is_object( $log ) ) {
            error_log( print_r( $log, true ) );
        } else {
            error_log( $log );
        }
    }
}

/**
 * Do not let plugin be accessed directly
 **/
if ( ! defined( 'ABSPATH' ) ) {
    write_log( "Plugin should not be accessed directly!" );
    exit; // Exit if accessed directly
}

/**
 * -----------------------------------------------------------------------------------------------------------
 * Do not forget to trigger a system call to wp-cron page at least each 30mn.
 * Otherwise we cannot be sure that trigger will be called.
 * -----------------------------------------------------------------------------------------------------------
 * Linux command:
 * crontab -e
 * 30 * * * * wget http://<url>/wp-cron.php
 */

/**
 * Add a custom schedule to wp.
 * @param $schedules array The  existing schedules
 *
 * @return mixed The existing + new schedules.
 */
function woocsp_schedules( $schedules ) {
    write_log("Creating custom schedule.");
    if ( ! isset( $schedules["10s"] ) ) {
        $schedules["10s"] = array(
            'interval' => 10,
            'display'  => __( 'Once every 10 seconds' )
        );
    }

    write_log("Custom schedule created.");
    return $schedules;
}

//Add cron schedules filter with upper defined schedule.
add_filter( 'cron_schedules', 'woocsp_schedules' );

//Custom function to be called on schedule triggered.
function scheduleTriggered() {
    write_log( "Scheduler triggered!" );
}
add_action( 'woocsp_cron_delivery', 'scheduleTriggered' );

// Register an activation hook to perform operation only on plugin activation
register_activation_hook(__FILE__, 'woocsp_activation');
function woocsp_activation() {
    write_log("Plugin activating.");

    //Trigger our method on our custom schedule event.
    if ( ! wp_get_schedule( 'woocsp_cron_delivery' ) ) {
        wp_schedule_event( time(), '10s', 'woocsp_cron_delivery' );
    }

    write_log("Plugin activated.");
}

// Deactivate scheduled events on plugin deactivation.
register_deactivation_hook(__FILE__, 'woocsp_deactivation');
function woocsp_deactivation() {
    write_log("Plugin deactivating.");

    //Remove our scheduled hook.
    wp_clear_scheduled_hook('woocsp_cron_delivery');

    write_log("Plugin deactivated.");
}

1

Korkarım ki birisinin bir işlevi olan sitenizi ziyaret etmesini beklemekten başka, tek seçenek sunucunuzda böyle bir şey kullanarak bir cron işi kurmaktır /programming/878600/how -to-create-cronjob-using-bash veya sunucunuzda bir cpanel stili arayüzünüz varsa, bazen bunu ayarlamak için bir GUI vardır.


evet. ben zaten cPnael oluşturulan bazı crons var .. anlıyorum .. ama şimdi bir işlevi çalıştırmak çalışıyorum functions.phpişlevi olduğunda çünkü pluginya da functions.phpbiz cpanel bir cron'u kurmak müşterilerine soramazsın kendi başlarına ..
Aptal Kodlayıcı

1

Cronjob Zamanlayıcı eklenti tek ihtiyacınız en az 1 işlem ve Unix Crontab tarifesi, sitenizi ziyaret kimse kalmadan güvenilir ve zamanında sık görevleri çalışmasını sağlar.

Kullanımı çok kolay ve çok esnektir. Kendi işlevinizi yaratır ve içinde bir eylem tanımlarsınız. Daha sonra eklenti menüsünden eyleminizi seçebilir ve istediğiniz zaman tetikleyebilirsiniz.


0

Bir zamanlama işlevi ve özyinelemeli bir WP Ajax işlevi kullanarak olası bir çözüm var.

  1. Bir işlevi çalıştırmak için 60 dakikalık bir zamanlama olayı oluşturma
  2. Bu işlev, Ajax kullanarak özyinelemeli bir işlevi tetikler. file_get_contents()
  3. Ajax fonksiyonunun veritabanında toplam sayısı 60 olan bir sayaç bulunur (saat içindeki her dakika için).
  4. Bu ajax işlevi sayacınızı aşağıdakiler için kontrol eder:

Sayaç 60'a eşit veya daha yüksekse sayacı sıfırlar ve bir sonraki cron işini bekler.

5'in katları (her 5 dakikada bir) sayacaksanız, istediğiniz işlevi yerine getirecektir

Ve koşulların yanı sıra, 59 saniye boyunca uyuyacak sleep(59);(işlevinizin hızlı olduğunu varsayarsak). Uykudan sonra file_get_contents()tekrar kullanarak kendini tetikleyecektir .

Dikkat edilmesi gereken önemli noktalar:

  1. İşlemi kesintiye uğratmanın bir yolunu oluşturun (yani DB'deki bir değeri kontrol etme)
  2. Aynı anda 2 işlemi önlemenin bir yolunu oluşturun
  3. File_get_contents üzerinde başlıktaki zaman sınırını 2 veya 3 saniye olarak ayarlayın, aksi takdirde sunucunun hiçbir şey beklemeden çeşitli işlemleri olabilir
  4. Kullanmadan set_time_limit(90);önce sunucunun uykudan önce işlevinizi kırmasını önlemek için

Bu bir çözümdür, iyi bir çözüm değildir ve sunucu tarafından engellenebilir. Harici bir cron kullanarak basit bir işlev ayarlayabilirsiniz ve sunucu, her 5 dakikada bir üzerindeki kaynakları kullanır. Bu çözümü kullanarak, sunucu her zaman üzerinde kaynakları kullanacaktır.


0

@ johano'nun cevabı, WP cron işi için özel bir aralığın nasıl ayarlanacağını doğru bir şekilde açıklar. İkinci soru yine de cevaplandırılmıyor, bu da her dakika bir cronun nasıl çalıştırılacağı:

  1. Dosyaya wp-config.phpaşağıdaki kodu ekleyin:

    define('DISABLE_WP_CRON', true);
  2. Bir cron işi ekleyin ( crontab -eunix / linux'da):

    1 * * * * wget -q -O - http://example.com/wp-cron.php?doing_wp_cron

İlk bölüm (1. adım) WordPress dahili cron işini devre dışı bırakır. İkinci bölüm (2. adım) WordPress cron işini her dakika manuel olarak çalıştıracaktır.

@ Johano'nun cevabı (her 5 dakikada bir görev nasıl yürütülür) ve benimki (cron'u manuel olarak çalıştırır) ile hedefinize ulaşmanız gerekir.

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.