Дублирование заданий Cron с использованием wp_next_scheduled / wp_schedule_event

Вопрос или проблема

Я работаю над плагином для регистрации и планирования различных cron-задач. Я:

  • использую WP Crontrol (только чтобы увидеть все мои cron-задачи и переопределить их при необходимости)
  • установил серверную cron-задачу и определил define('DISABLE_WP_CRON', true);

Когда я зашел в ‘Cron Events’ в Crontrol, я увидел, что некоторые функции добавлены буквально сотни раз. Конкретно в ‘Cron Events’ регистрируется/отображается функция, а не хук. Упрощенная версия моего кода:

class My_Cron_Manager {

    /**
     * Конструктор
     */
    public function __construct() {

        add_filter( 'wp', array( $this, 'my_schedule_cron_jobs' ) );
        add_action( 'my_cron_event_func', array( $this, 'my_cron_job_func' ));

    }

    /**
     * Планирование cron-задач
     */
    public static function my_schedule_cron_jobs() {

        if (! wp_next_scheduled ( 'my_cron_job_func' )) {
            wp_schedule_event(time(), 'twicedaily', 'my_cron_job_func');
        };

    }

    /**
     * Моя функция
     */
    public static function my_cron_job_func() {

        // Выполнение задачи

    }

}

new My_Cron_Manager();

Я подозреваю, что у меня была ошибка в коде, которая повторно регистрировала функцию, но я не совсем уверен. Правильно ли я использую wp_next_scheduled и wp_schedule_event?

Может кто-нибудь, пожалуйста, ответит, вызывает ли мой код дублирование регистрации хуков/функций?

Заранее спасибо!

Хорошо, я считаю, что сделал все правильно. Было бы интересно узнать, если у кого-то есть дополнительные соображения, но, как мне кажется, происходило следующее:

  • Я неправильно вызывал свой класс
  • Я ссылался на функцию класса в wp_next_scheduled и wp_schedule_event, когда должен был ссылаться на обратный вызов/хук.

Мой пересмотренный код (который был протестирован и я могу подтвердить, что работает).


define( 'MY_CRON_FILE', __FILE__ );

class MY_Cron_Manager {

    /**
    * Подключение методов.
    */
    public static function init() {

        register_activation_hook( MY_CRON_FILE, array(__CLASS__, 'my_schedule_cron_jobs' ));
        add_action( 'my_cron_job_event_func', array( __CLASS__, 'my_cron_job_func' )); //

    }

    /**
     * Планирование cron-задач
     */
    public static function my_schedule_cron_jobs() {

        if (! wp_next_scheduled ( 'my_cron_job_event_func' )) {
            wp_schedule_event(time(), 'twicedaily', 'my_cron_job_event_func');
        };

    }

    /**
     * Моя функция
     */
    public static function my_cron_job_func() {

        // Выполнение задачи

    }

}

MY_Cron_Manager::init();

Ответ или решение

Вопрос об использовании функций wp_next_scheduled и wp_schedule_event в вашем плагине для управления cron задачами в WordPress действительно актуален. Давайте подробно разберём вашу ситуацию, учитывая предоставленный вами код и комментарии.

Проблема дублирования Cron задач:

Согласно вашему описанию, вы столкнулись с проблемой дублирования функций в списке Cron событий, что, вероятно, связано с неправильной регистрацией задач cron. Рассмотрим, как ваш первоначальный код мог привести к этой проблеме и какие изменения вы внесли для её устранения.

Техника решения:

  1. Изначальный код:

    • В начале вы регистрировали фильтр 'wp', который выполнял функцию my_schedule_cron_jobs. Если страница была перезагружена или обращение к серверу происходило многократно, задача cron могла регистрироваться многократно из-за неправильной логики проверки, какой именно хуку функция подвязана.
  2. Ошибки и их причины:

    • Использование метода крон инициализации в конструкторе класса, где он мог вызываться неоднократно, если класс создавался несколько раз, что и стало причиной дублирования.
    • Неверная проверка на регистрацию, обращение к функции wp_next_scheduled или wp_schedule_event могло быть неактуально.

Исправленный подход:

  1. Исправленный код:

    • Вы перенесли планирование Cron задач в метод статической инициализации класса при активации плагина, используя register_activation_hook, что предотвращает многократную регистрацию задачи cron при каждом хитте страницы.
    • Вы изменили название хука для события cron, сделав его отличным от самой функции выполнения. Это позволило избежать путаницы и лишней нагрузки при обработке событий.
  2. Оптимизации:

    • Использование подхода с использованием статических методов класса в целях уменьшения количества экземпляров класса и предотвращения лишнего выполнения логики.
    • Назначение хука my_cron_job_event_func открыло дальнейшие возможности для гибкого управления cron задачами внутри WordPress.

Итоги и рекомендации:

Теперь ваш код отвечает стандартам лучших практик WordPress для управления cron задачами. Вы сообщили, что это устранило проблему, но дополнительно убедитесь в следующем:

  • Регулярно проверяйте наличие конфликтов с другими плагинами, которые могут устанавливать функции с теми же именами cron задач.
  • Мониторьте производительность сайта и используйте инструменты, такие как WP Crontrol, для отслеживания состояния ваших cron задач.

На этом мы завершаем наш разбор, желая вам успешного опыта в дальнейшей разработке плагинов для WordPress. Если всё выполнено верно, ваш плагин теперь должен корректно управлять cron задачами без избыточного использования серверных ресурсов.

Оцените материал
Добавить комментарий

Капча загружается...