Як запускати функцію кожні 5 хвилин?


15

У мене є функція, яку потрібно запускати кожні 5 хвилин. Я згадав наступне з кодексу:

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

Я хочу запускати цю функцію кожні 5 минут незалежно від того, коли слід запускати. Як я можу це зробити?

Також в кодексі сказано, що cron буде запущений, коли відвідувач відвідує сайт. Чи є спосіб запустити крон так само, як за хвилини і не чекати візиту?

скажімо, наступну функцію слід запускати кожні 5 хвилин, то як я можу це зробити за допомогою wp_schedule_event()або wp_cron?

function run_evry_five_minutes(){
    // codes go here
}

Ви краще подивіться, наприклад, на послуги cron Linux або сторони, якщо вам потрібен такий короткий інтервал і точність,
birgire

сайт має великі затори .. тому не потрібно враховувати часовий інтервал .. впевнений, що він буде спрацьовувати кожні 2 або 3 хвилини .. клієнти вважають за краще це робити зfunctions.php
Foolish Coder

неможливо запустити файл php без того, що на сервері працює таймер.
Ендрю Велч

файл? ми говоримо про функцію у function.php
Foolish Coder

Як ви вважаєте, безкоштовна послуга моніторингу може стати пінгом, який запускає CRON? newrelic.com/server-monitoring
jgraup

Відповіді:


28

Ви можете створити новий час розкладу за допомогою 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');

Тепер ви можете запланувати свою функцію:

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

Щоб запланувати його лише один раз, загорніть його у функцію та перевірте перед її запуском:

$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! Якщо не вказати параметр $ args у wp_next_scheduled, але мати $ args для wp_schedule_event, це призведе до планування майже нескінченного числа тієї ж події (замість лише однієї).

Нарешті, створіть фактичну функцію, яку ви хочете запустити:

function my_schedule_hook(){
    // codes go here
}

Я думаю, що важливо зазначити, що wp-cron перевіряє графік та виконує належні заплановані завдання щоразу при завантаженні сторінки.

Отже, якщо у вас веб-сайт із низьким трафіком, який має лише 1 відвідувача на годину, wp-cron запуститься лише тоді, коли цей відвідувач перегляне ваш сайт (раз на годину). Якщо на вашому сайті з високим трафіком відвідувачі запрошують сторінку щосекунди, wp-cron буде запускатися щосекунди, викликаючи додаткове навантаження на сервер.

Рішення полягає в тому, щоб дезактивувати wp-cron і запустити його через справжнє завдання cron у часовий інтервал, коли ви найшвидше повторюєте заплановану роботу wp-cron (у вашому випадку 5 хв).

Лукас Рольф пояснює проблему та детально дає рішення.

Як альтернатива, ви можете використовувати безкоштовну сторонній сервіс, як UptimeRobot, щоб запитувати ваш сайт (і запускати wp-cron) кожні 5 хвилин, якщо ви не хочете деактивувати wp-cron і запустити його через справжнє завдання cron.


2

Якщо ваш сайт отримує великий трафік, ви можете спробувати set_transient()запустити його (приблизно приблизно) кожні 5 хвилин, наприклад:

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

Ну, е - е, так ...?!
Бонгер

да., це не працює .. Я використовував наступний код в , functions.phpколи візит зробити на сторінці, оновлення буде зроблено в таблиці в моїй базі даних .. function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }. Але таблиця БД не оновлюється навіть через 6 хвилин.
Дурний кодер

Не знаю, чому це не працює для вас, але насправді думати про це просто за допомогою get_transient()/ set_transient()без речей cron має набагато більше сенсу, набагато простіше, оновить відповідь ...
bonger

@bonger це хороша альтернатива для wp_schedule_event ()?
Марко Куніч

@ MarkoKunić Не знаю, чесно кажучи, не пробував ... це було запропоновано лише як вирішення, але якщо ви спробуєте це, дайте нам знати ...! (Відповідь Йохано Фієрри виглядає добре wordpress.stackexchange.com/a/216121/57034 )
Бонгер

2

Ви можете запустити його в активації плагіну замість кожного виклику плагіна:

//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

Я боюся, що окрім того, як чекати, коли хтось відвідає ваш веб-сайт, який виконує функцію, єдиний інший варіант - це налаштувати роботу на своєму сервері, використовуючи щось подібне /programming/878600/how -to-create-cronjob-using-bash або якщо у вас на сервері інтерфейс стилю cpanel, іноді є налаштування для цього налаштування.


да,., я розумію , що .. У мене вже є певний crons створений з cPnael .. але тепер я намагаюся запустити функцію з , functions.phpтому що , коли функція в pluginабо functions.phpми не можемо запитати клієнт , щоб створити Хроні від CPanel самостійно ..
Дурний кодер

1

Cronjob Планувальник плагін дозволяє запускати часті завдання надійно і своєчасно без будь-якого має відвідати ваш сайт, все , що вам потрібно , по крайней мере , 1 дію і графік Unix Crontab.

Він дуже простий у використанні та дуже гнучкий. Ви створюєте власну функцію та визначаєте дію в ній. Потім ви можете вибрати свою дію з меню плагінів і запустити її, коли захочете.


0

У мене можливе рішення з використанням функції розкладу та рекурсивної функції WP Ajax.

  1. Створіть подію розкладу на 60 хвилин для запуску функції
  2. Ця функція запустить рекурсивну функцію за допомогою Ajax through file_get_contents()
  3. Функція ajax матиме лічильник у базі даних із загальною кількістю 60 (за кожну хвилину протягом години).
  4. Ця функція ajax перевірить ваш лічильник на:

Якщо лічильник рівний або більший за 60, він скине лічильник і чекає наступного завдання cron.

Якщо лічильник кратний 5 (так що кожні 5 хвилин), він виконає бажану функцію

І, крім умов, він буде спати 59 секунд sleep(59);(за умови, що ваша функція швидка). Після сну він запустить себе file_get_contents()знову.

Важливі речі:

  1. Створіть спосіб переривання процесу (тобто перевірка значення в БД)
  2. Створіть спосіб запобігання одночасно 2 процесам
  3. У file_get_contents встановіть обмеження часу на заголовку 2 або 3 секунди, інакше сервер може мати різні процеси, які нічого не чекають
  4. Ви можете скористатися set_time_limit(90);функцією, щоб спробувати не допустити, щоб сервер порушив вашу функцію перед сном

Це не дуже гарне рішення, і його може заблокувати сервер. Використовуючи зовнішній крон, ви можете встановити просту функцію, і сервер буде використовувати ресурси на ньому раз на кожні 5 хвилин. Використовуючи це рішення, сервер буде постійно використовувати ресурси на ньому.


0

@hahano відповідь правильно пояснює, як встановити спеціальний інтервал для WP cron завдання. Однак на друге питання не відповіли, а саме - як запускати крон щохвилини:

  1. У файл wp-config.phpдодайте наступний код:

    define('DISABLE_WP_CRON', true);
  2. Додайте завдання cron ( crontab -eна unix / linux):

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

Перша частина (крок 1) відключить внутрішнє завдання Word для Cron. Друга частина (крок 2) щохвилини виконуватиме завдання WordPress cron вручну.

За допомогою відповіді @ Johano (як виконувати завдання кожні 5 хвилин) і моєї (як вручну запустити cron), ви повинні мати можливість досягти своєї мети.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.