Bagaimana menjalankan suatu fungsi setiap 5 menit?

14

Saya memiliki fungsi untuk dijalankan setiap 5 menit. Saya telah merujuk berikut dari kodeks:

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

Saya ingin menjalankan fungsi ini hanya setiap 5 minuet kapan pun harus dimulai. Bagaimana saya bisa begini?

Juga dikatakan codex mengatakan cron akan dijalankan ketika pengunjung mengunjungi situs tersebut. Apakah ada cara untuk menjalankan cron setiap menit dan tidak menunggu kunjungan?

katakanlah fungsi berikut harus dijalankan setiap 5 menit lalu bagaimana saya bisa melakukannya menggunakan wp_schedule_event()atau wp_cron?

function run_evry_five_minutes(){
    // codes go here
}
Coder Bodoh
sumber
Anda sebaiknya melihat misalnya cron Linux atau layanan cron pihak ke-3 jika Anda membutuhkan interval dan keakuratan yang singkat,
birgire
situs memiliki lalu lintas yang padat .. jadi tidak perlu mempertimbangkan interval waktu .. yakin itu akan dipicu untuk setiap 2 atau 3 menit .. klien lebih suka melakukannya darifunctions.php
Foolish Coder
itu tidak mungkin untuk memicu file php tanpa sesuatu yang berjalan di server dengan penghitung waktu.
Andrew Welch
mengajukan? kita berbicara tentang fungsi di functions.php
Foolish Coder
Apakah Anda pikir layanan pemantauan gratis bisa menjadi ping yang memicu CRON? newrelic.com/server-monitoring
jgraup

Jawaban:

27

Anda dapat membuat waktu jadwal baru melalui cron_schedules:

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

Sekarang Anda dapat menjadwalkan fungsi Anda:

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

Untuk hanya menjadwalkannya sekali, bungkus dalam suatu fungsi dan periksa sebelum menjalankannya:

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

Perhatikan parameter $ args! Tidak menentukan parameter $ args di wp_next_scheduled, tetapi memiliki $ args untuk wp_schedule_event, akan menyebabkan jadwal acara yang hampir tak terbatas jumlahnya sama (bukan hanya satu).

Terakhir, buat fungsi aktual yang ingin Anda jalankan:

function my_schedule_hook(){
    // codes go here
}

Saya pikir penting untuk menyebutkan bahwa wp-cron memeriksa jadwal dan menjalankan pekerjaan yang dijadwalkan setiap kali halaman dimuat.

Jadi, jika Anda memiliki situs web dengan lalu lintas rendah yang hanya memiliki 1 pengunjung per jam, wp-cron hanya akan berjalan ketika pengunjung menelusuri situs Anda (satu jam sekali). Jika Anda memiliki situs dengan lalu lintas tinggi dengan pengunjung yang meminta halaman setiap detik, wp-cron akan terpicu setiap detik menyebabkan beban tambahan pada server.

Solusinya adalah dengan menonaktifkan wp-cron dan memicunya melalui pekerjaan cron nyata dalam interval waktu Anda tercepat mengulangi pekerjaan wp-cron dijadwalkan (5 menit dalam kasus Anda).

Lucas Rolff menjelaskan masalahnya dan memberikan solusinya secara terperinci.

Sebagai alternatif, Anda dapat menggunakan layanan pihak ke-3 gratis seperti UptimeRobot untuk menanyakan situs Anda (dan memicu wp-cron) setiap 5 menit, jika Anda tidak ingin menonaktifkan wp-cron dan memicunya melalui pekerjaan cron nyata.

Johano Fierra
sumber
2

Jika situs Anda mendapatkan lalu lintas yang padat maka Anda dapat mencoba menggunakannya set_transient()untuk menjalankannya (sangat kurang-lebih) setiap 5 menit, misalnya:

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' );
}
bonger
sumber
Nah, er, yeah?! ...
bonger
ya., itu tidak bekerja .. i sudah digunakan kode berikut functions.phpsaat melawat make ke halaman, update akan dilakukan untuk tabel dalam database saya .. function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }. Tetapi tabel DB tidak diperbarui bahkan setelah 6 menit.
Foolish Coder
Tidak tahu mengapa itu tidak bekerja untuk Anda tetapi sebenarnya hanya memikirkannya saja get_transient() / set_transient()tanpa hal-hal cron lebih masuk akal, lebih sederhana, akan memperbarui jawaban ...
bonger
@bonger adalah alternatif yang bagus untuk wp_schedule_event ()?
Marko Kunic
@ MarkoKunić Tidak tahu harus jujur, belum mencobanya ... itu hanya ditawarkan sebagai solusi tetapi jika Anda mencobanya beri tahu kami ...! (Jawaban Johano Fierra terlihat bagus di wordpress.stackexchange.com/a/216121/57034 )
bonger
2

Anda dapat memicunya dalam aktivasi plugin alih-alih pada setiap panggilan plugin:

//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.");
}
Régis Ramillien
sumber
1

Saya takut bahwa selain menunggu seseorang untuk mengunjungi situs Anda yang menjalankan suatu fungsi, satu-satunya pilihan lain adalah mengatur pekerjaan cron di server Anda menggunakan sesuatu seperti ini /programming/878600/how -Untuk membuat-cronjob-using-bash atau jika Anda memiliki antarmuka gaya cpanel di server Anda, kadang-kadang ada gui untuk mengatur ini.

Andrew Welch
sumber
ya,., saya mengerti itu .. Saya sudah memiliki beberapa crons yang dibuat dari cPnael .. tapi sekarang saya mencoba menjalankan suatu fungsi dari functions.phpkarena ketika fungsinya berada di dalam pluginatau di functions.phpkita tidak dapat meminta klien untuk mengatur cron dari cpanel sendiri ..
Foolish Coder
1

Itu Cronjob Scheduler Plugin memungkinkan Anda untuk menjalankan tugas-tugas sering andal dan tepat waktu tanpa ada harus mengunjungi situs Anda, yang Anda butuhkan adalah minimal 1 tindakan dan jadwal Unix Crontab.

Ini sangat mudah digunakan, dan sangat fleksibel. Anda membuat fungsi Anda sendiri, dan menentukan tindakan di dalamnya. Kemudian Anda dapat memilih tindakan Anda dari menu plugin dan memecatnya kapan pun Anda mau.

Marco
sumber
0

Saya punya solusi yang mungkin menggunakan fungsi jadwal dan fungsi WP Ajax rekursif.

  1. Buat jadwal acara 60 menit untuk menjalankan fungsi
  2. Fungsi ini akan memicu fungsi rekursif menggunakan Ajax through file_get_contents()
  3. Fungsi ajax akan memiliki penghitung pada database dengan jumlah total 60 (untuk setiap menit dalam satu jam).
  4. Fungsi ajax ini akan memeriksa penghitung Anda untuk:

Jika penghitung sama atau lebih tinggi dari 60 itu akan mengatur ulang penghitung dan menunggu pekerjaan cron berikutnya.

Jika counter kelipatan 5 (jadi pada setiap 5 menit) itu akan menjalankan fungsi yang Anda inginkan

Dan, di samping kondisi, itu akan tidur selama 59 detik sleep(59);(dengan asumsi fungsi Anda itu cepat). Setelah tidur, itu akan memicu menggunakan dirinya sendirifile_get_contents() lagi.

Hal-hal penting yang perlu diperhatikan:

  1. Buat cara untuk menghentikan proses (yaitu memeriksa nilai pada DB)
  2. Buat cara untuk mencegah 2 proses sekaligus
  3. Pada file_get_contents, atur batas waktu pada header menjadi 2 atau 3 detik, jika tidak, server mungkin memiliki berbagai proses menunggu apa-apa
  4. Anda mungkin ingin menggunakan set_time_limit(90);untuk mencegah server untuk merusak fungsi Anda sebelum tidur

Ini solusi, bukan yang bagus, dan mungkin diblokir oleh server. Menggunakan cron eksternal Anda dapat mengatur fungsi sederhana dan server akan menggunakan sumber daya di atasnya setiap 5 menit sekali. Menggunakan solusi ini, server akan menggunakan sumber daya di dalamnya sepanjang waktu.

Bruno Cantuaria
sumber
0

Jawaban @ johano dengan benar menjelaskan cara mengatur interval khusus untuk pekerjaan WP cron. Pertanyaan kedua tidak dijawab, yaitu bagaimana menjalankan cron setiap menit:

  1. Dalam file tersebut wp-config.php, tambahkan kode berikut:

    define('DISABLE_WP_CRON', true);
  2. Tambahkan pekerjaan cron ( crontab -edi unix / linux):

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

Bagian pertama (langkah 1) akan menonaktifkan pekerjaan cron internal WordPress. Bagian kedua (langkah 2) akan menjalankan pekerjaan cron WordPress secara manual setiap menit.

Dengan jawaban @ Johano (cara menjalankan tugas setiap 5 menit) dan milik saya (cara menjalankan cron secara manual), Anda harus dapat mencapai tujuan Anda.

Mike
sumber