Как запускать функцию каждые 5 минут?

15

У меня есть функция, которая будет запускаться каждые 5 минут. Я сослался на следующее из кодекса:

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

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

Также в кодексе говорится, что cron будет запущен, когда посетитель посетит сайт. Есть ли способ запустить cron так же, как за минуты и не дожидаясь посещения?

скажем, следующую функцию следует запускать каждые 5 минут, тогда как я могу это сделать с помощью wp_schedule_event()или wp_cron?

function run_evry_five_minutes(){
    // codes go here
}
Глупый кодер
источник
Если вам нужен такой короткий интервал и точность, вам лучше изучить службы Linux cron или cron сторонних производителей
birgire
сайт имеет большой трафик .. поэтому не нужно учитывать временной интервал .. уверен, что он будет срабатывать каждые 2 или 3 минуты .. клиенты предпочитают делать это сfunctions.php
Foolish Coder
невозможно запустить файл php без запуска таймера на сервере.
Эндрю Уэлч
файл? мы говорим о функции в functions.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

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

Эндрю Уэлч
источник
да, я понимаю, что .. у меня уже есть несколько крон, созданных из cPnael .. но сейчас я пытаюсь запустить функцию из, functions.phpпотому что, когда функция находится в pluginили в, functions.phpмы не можем просить клиентов установить крон из cpanel самостоятельно ..
Глупый Кодер
1

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

Он очень прост в использовании и очень гибкий. Вы создаете свою собственную функцию и определяете действие внутри нее. Затем вы можете выбрать действие из меню плагинов и запускать его в любое время.

Marco
источник
0

У меня есть возможное решение, используя функцию расписания и рекурсивную функцию WP Ajax.

  1. Создайте расписание события 60 минут для запуска функции
  2. Эта функция запускает рекурсивную функцию, используя Ajax через 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);функцию, чтобы предотвратить нарушение работы сервера перед сном.

Это решение, а не хорошее, и оно может быть заблокировано сервером. Используя внешний cron, вы можете установить простую функцию, и сервер будет использовать ресурсы один раз каждые 5 минут. Используя это решение, сервер будет использовать ресурсы на нем все время.

Бруно Кантуария
источник
0

Ответ @ johano правильно объясняет, как настроить пользовательский интервал для задания cron 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) отключит внутреннее задание WordPress cron. Вторая часть (шаг 2) будет запускать задание WordPress cron вручную каждую минуту.

С ответом @ Johano (как запускать задачу каждые 5 минут) и моим (как вручную запускать cron) вы сможете достичь своей цели.

Майк
источник