Планирование событий с помощью WordPress Cron.

Не знаю как у вас, но у меня каждое утро появляется, по крайней мере, 10 писем, которых не было, когда я шел спать. Многие из вас, наверняка, знают, что эти письма рассылаются вовсе не лишенными сна людьми или попивающими кофе стажерами. Многие люди не понимают, что существуют специализированные системы, которые автоматизируют задачи, такие как рассылка писем по электронной почте.

Clock Tower

(Изображение: Дон Шутз).

В этом случае на помощь приходят Cron (“демон” ОС Unix, исполняющий предписанные команды в строго определённые дни и часы, указанные в специальном файле с именем crontab) и WordPress Cron. Однако эти инструменты не могут быть использованы для решения более интеллектуальных задач, нежели наполнение почтовых ящиков. Перед тем, как приступить к рассмотрению особенностей этих инструментов, я перечислю основные темы, которые мы будем затрагивать:

  • Что такое Cron и как с ним связан WordPress?
  • Введение в WordPress Cron.
  • Ограничения WordPress Cron (и возможные решения существующих проблем).
  • Для решения каких задач используется WordPress Cron?
  • Как WordPress выполняет запланированные задачи?
  • Как выполнять планирование задач с помощью WordPress Cron.
  • Советы по разработке с помощью WordPress Cron.
  • Популярные плагины, в которых используется WordPress Cron.

Вам все еще интересно? Тогда давайте начнем.

Что такое Cron и как с ним связан WordPress?

Cron – это специализированная система, изначально созданная для UNIX (многопользовательская многозадачная операционная система, первоначально разработанная Кеном Томпсоном (Ken Thompson) и Денисом Ритчи (Dennis Ritchie) в компании AT&T Bell Laboratory в 1969 г. для использования в мини-компьютерах; в настоящее время существует в различных формах и реализациях; считается мощной операционной системой, которая менее машинозависима, чем остальные операционные системы; написана на языке С). Эта система дает возможность пользователям выполнять команды, программы и другие задачи в указанное время. Википедия дает этому термину вполне исчерпывающую трактовку: «Cron – это контролируемый по времени планировщик задач».

Если говорить обобщенно, то основная возможность этого инструмента в том, что вы можете запланировать действие и задать определенное время его выполнения, без необходимости вручную запускать код в это же самое время. Но как этот инструмент можно использовать для веб-сайта — в частности для вашего WordPress веб-сайта? Вы можете выполнить настройку вашего WordPress веб-сайта, используя UNIX cron систему предварительно встроив её в операционную систему вашего сервера; однако, это может быть трудно по двум основным причинам:

  1. Ваш хост не позволяет выполнить необходимые настройки Cron из соображений безопасности.
  2. Для разных серверов установка cron выполняется по-разному, для чего потребуется знание особенностей различных систем.

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

Введение в WordPress Cron.

WordPress Cron – это то, что многие люди называют «псевдо-cron системой». Разница заключается в том, как UNIX cron and WordPress Cron выполняют действия. Типичная UNIX cron система работает в следующем порядке:

  1. Время привязывается к выполнению действия.
  2. Cron запускает действие, которое связано с определенным временем.

Cron WordPress работает немного по-другому:

  1. Посетитель заходит на любую страницу вашего WordPress веб-сайта.
  2. WordPress Cron проверяет каждое cron событие, и отбирает только те события, для которых уже прошло назначенное время.
  3. Если назначенное для события время прошло, то WordPress Cron выполняет все действия, которые связаны с этим событием.

Ограничения WordPress Cron (и возможные решения существующих проблем).

Вы, наверное, часто задаетесь вопросом: «А что произойдет, если вообще не заходить на веб-сайт? Будет ли запущен WordPress Cron?» Самое большое ограничение WordPress Cron связано с его неспособностью работать без посетителей. Это приводит к нескольким потенциальным проблемам.

WordPress Cron неточен (ноль просмотров = ноль запусков Cron).

Если вы запланировали рассылку писем по электронной почте на 2:00 ночи в понедельник, то отправка вероятнее всего не будет выполнена именно в это время. Все будет зависеть от наличия посетителей в 2:00. Рассылка писем будет произведена во время первого визита после 2:00.

В большинстве случаев эта неточность мало влияет на ситуацию. Но что, если в письме содержалось напоминание о событии, которое должно произойти на следующий день, во вторник? Если посетитель зайдет в ночь на вторник, то в рассылке писем, скорее всего, не будет никакого смысла и, таким образом, вы будете только путать пользователей.

Итак, давайте рассмотрим влияние, которое оказывает отсутствие пользователей. Если на веб-сайте отсутствует какой-либо трафик, то WordPress Cron никогда не будет запущен.

Выходом из этой ситуации является создание более точной cron системы.

Если для одного из событий вашего веб-сайта требуется задать более точное время выполнения, то вы можете воспользоваться одним из двух способов. Вы можете задать для cron системы сервера обращение к wp-cron.php через определенные промежутки времени. Для этого следуйте инструкциям, изложенным в статье Хариша Чохана на Wptuts+. Если эта процедура кажется для вас слишком сложной, то можно воспользоваться таким инструментом, как Pingdom для запуска HTTP запроса непосредственно к wp-cron.php.

Запуск сложных процессов может замедлить работу вашего веб-сайта.

Аналогично запуску любого сложного процесса при загрузке страницы, WordPress Cron может значительно замедлить работу вашего веб-сайта. WordPress Cron инициирует сложные процессы, связанные с планированием событий.

Выходом из данной ситуации является максимальное упрощение WordPress Cron действий.

Если вам часто приходится запускать действия, связанные с планировкой событий, то постарайтесь сделать их можно более простыми. Любое дополнительное увеличение уровня сложности будет негативно влиять на производительность для конечных пользователей.

Для решения каких задач используется WordPress Cron?

Мы рассмотрели, что такое WordPress Cron, и какие он имеет ограничения. Теперь настало время выяснить, для чего он на самом деле используется. WordPress Cron может быть использован для планирования двух типов событий:

  • тех, которые выполняются регулярно через заданные промежутки времени;
  • тех, которые выполняются только один раз в установленное время.

Примеры задач, которые выполняются регулярно через заданные промежутки времени.

Ядро WordPress и различные плагины используют WordPress Cron для регулярного выполнения через заданные промежутки времени следующих задач:

  • резервное копирование веб-сайта,
  • проверка текущей версии WordPress для обеспечения его актуального состояния,
  • проверка обновлений для плагинов и тем,
  • оптимизация базы данных для повышения производительности.

Примеры задач, которые выполняются только один раз в установленное время.

События единичного характера, которые выполняются только один раз, используются для таких действий, как:

  • публикация в блоге в заданное время,
  • отправка электронной почты в заданное время.

Как WordPress выполняет запланированные задачи?

Прежде чем перейти к планированию своих собственных событий, было бы полезно понять, как работает WordPress Cron. WordPress Cron работает с использованием двух файлов:

  • /wp-includes/cron.php Этот файл содержит Cron WordPress API и функции, необходимые для планирования событий.
  • /wp-cron.php Этот файл отвечает за работу WordPress Cron и вызывает запланированные события. Этот файл загружается с помощью spawn_cron () функции в cron.php.

Мы выяснили назначение файлов, но что происходит, когда загружается WordPress страница? Давайте вместе пошагово рассмотрим весь процесс (но прежде чем это сделать, нужно разобраться, что такое хуки и фильтры):

  1. Посетитель запрашивает страницу с вашего веб-сайта.
  2. В файле /wp-includes/default-filters.php WordPress переносит wp_cron() функцию в init действие.
  3. Когда в /wp-settings.php происходит init действие, запускается функция wp_cron().
  4. Функция wp_cron() гарантирует рабочее состояние WordPress Cron и, что раннее запланированное cron событие осуществится в назначенное время.
  5. Если время выполнения события прошло, то запускается функция spawn_cron() и выполняется проверка завершения cron. Если проверка окажется положительной, то эта функция больше не будет запускаться..
    if ( defined('DOING_CRON') || isset($_GET['doing_wp_cron']) )
      return;
    
  6. Начиная со строки 247 в файле cron.php, функция spawn_cron() загружает wp-cron.php через HTTP запрос. (Использование wp_remote_post() для загрузки wp-cron.php не мешает посетителю выполнять загрузку оставшейся части страницы)
    $cron_request = apply_filters( 'cron_request', array(
    	'url' => site_url( 'wp-cron.php?doing_wp_cron=' . $doing_wp_cron ),
    	'key' => $doing_wp_cron,
    	'args' => array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters( 'https_local_ssl_verify', true ) )
    ) );
    
    wp_remote_post( $cron_request['url'], $cron_request['args'] );
    
  7. Загружается файл wp-cron.php и циклически анализирует все запланированные cron события, выполняя следующие действия:
    • Строка 85. Если запланировано периодически повторяющееся событие, то WordPress запускает wp_reschedule_event () для планирования следующего вхождение этого события.
    • Строка 90. WordPress вне очереди обрабатывает текущее событие, используя wp_unschedule_event (), и в будущем это событие больше не будет запускаться.
    • Строка 92. WordPress запускает все функции, связанные с хуком в cron событии, включая все действия, которые были запланированы для запуска в этот момент или до этого момента, используя Do_action_ref_array ().
    foreach ( $crons as $timestamp => $cronhooks ) {
    	if ( $timestamp > $gmt_time )
    		break;
    
    	foreach ( $cronhooks as $hook => $keys ) {
    
    		foreach ( $keys as $k => $v ) {
    
    			$schedule = $v['schedule'];
    
    			if ( $schedule != false ) {
    				$new_args = array($timestamp, $schedule, $hook, $v['args']);
    				call_user_func_array('wp_reschedule_event', $new_args);
    			}
    
    			wp_unschedule_event( $timestamp, $hook, $v['args'] );
    
     			do_action_ref_array( $hook, $v['args'] );
    
    			// If the hook ran too long and another cron process stole the lock, quit.
    			if ( _get_cron_lock() != $doing_wp_cron )
    				return;
    		}
    	}
    }
    

Как и в случае организации исходного кода WordPress, данный код структурирован таким образом, что его достаточно легко просматривать. Я советую вам самостоятельно просмотреть код в обоих файлах cron.php и wp-cron.php и узнать больше.

Как выполнять планирование задач с помощью WordPress Cron?

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

Создание периодических событий в WordPress Cron.

Создание события, которое повторяется в соответствии с фиксированным графиком, осуществляется с помощью команды wp_schedule_event( $timestamp, $recurrence, $hook, $args ), в которой используются следующие четыре параметра:

  • $timestamp (обязательно целочисленное значение). Здесь нужно задать время, когда начнется выполнение события. Временная метка должна присутствовать в UNIX и в GMT (среднее время по Гринвичу). Если вы используете местное время, то его обязательно нужно будет преобразовать в соответствии с GMT, либо же событие не будет запущено в нужное вам время.
  • $recurrence (обязательно строковое значение). Это значение определяет насколько часто должно происходить событие. По умолчанию могут использоваться значения hourly (ежечасно), twicedaily (дважды в день) или daily (ежедневно). Вы также можете использовать свои собственные варианты, а немного позже мы рассмотрим, как их можно добавить.
  • $hook (обязательно строковое значение). Здесь задается имя действия, которое вы хотели бы выполнить. Преимущество вызова хука действия перед функцией в том, что вы можете связать несколько функций в одном хуке, используя add_action ().
  • $args (по выбору массив). Это все аргументы, которые вы хотите передать в функцию. Это может быть идентификатор публикации, идентификатор резервного копирования, идентификатор пользователя или любая другая информация, которую вы будете использовать в своих функциях.

Допустим, мы создали плагин, который создает резервные копии базы данных WordPress один раз в день. Если вы захотите запланировать резервное копирование с помощью WordPress Cron, то программный код будет выглядеть следующим образом:

//On plu ... 

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.