Сегодня мы изучим функции WP-Cron — планировщика задач в WordPress, о котором имеется не так много информации. Основная цель WP-Cron: настройка планирования, а также выполнение различных зависящих от времени задач. Мы изучим некоторые приемы его использования, рассмотрим потенциальные проблемы, с которыми можно столкнуться в ходе работы, а также взглянем на то, как обойти разные сложности.

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

Одна из возможностей WordPress, о которой написано не так много статей — это WP-Cron. Те из вас, кто работал с Cron в Linux, знают, как работает эта функция.

Что такое Cron?

Cron — это команда UNIX, созданная для того, чтобы планировать задачи. Зачастую cron используется для планировки периодически выполняемых задач. Скажем, вы могли бы использовать функцию cron для отправки ежедневных уведомлений. Cron — это процесс-демон; это означает, что он работает постоянно, ожидая определенных событий.

Как работает Cron

Поскольку WordPress ставится на самые разные системы, разработчикам WordPress пришлось для корректного выполнения задач внедрить псевдо-cron, включающий в себя функции WP-Cron, которые помогают выполнять следующие действия:

  • Проверка обновлений плагинов и тем
  • Публикация запланированных записей
  • Отправка уведомлений
  • И многое другое!

В отличие от обычных cron задач, которые выполняются в определенное время в зависимости от настроек сервера, функция WP-Cron запускается всякий раз, когда кто-либо посещает веб-сайт на базе WordPress. Это позволяет сайту корректно работать на самых разных серверах, поскольку WP-Cron помогает устранить большую часть специфичных для сервера требований. При каждой загрузке страницы WordPress проверяет, требуется ли запускать WP-Cron. Если имеется такая необходимость, то WordPress пытается отправить запрос через HTTP к файлу wp-cron.php.

Причина вызова wp-cron.php заключается в том, что некоторые задачи могут потребовать значительного времени выполнения; но пользователь, запрашивающий WP-страницу, не может долго ждать. Вызов wp-cron.php помогает сохранить функцию WP-Cron запущенной — в виде отдельного фонового процесса, что не приводит к задержке загрузки страницы для пользователей. Как только функция WP-Cron запущена, она будет выполняться до тех пор, пока все необходимые задачи не будут завершены, либо пока не пройдет определенное время выполнения, заданное в конфигурации сервера.

В зависимости от настроек вашего веб-хоста, WP-Cron может провалить завершение задач, или даже вообще не работать. Сайты с высоким трафиком сталкиваются с еще одним списком проблем, включающим в себя запуск многочисленных WP-Cron процессов в цикле. Большая часть людей винит во всех грехах WordPress, хотя проблема не всегда кроется в WP. Каждая ситуация различна. Нужно анализировать все условия, чтобы уже на их основе настроить WordPress для идеальной работы. Далее мы покажем, с какими проблемами чаще всего сталкиваются пользователи, и как решить эти проблемы.

Некоторые проблемы с WP-Cron

Проблема первая: Запуск нескольких WP-Cron процессов на сайтах с высоким трафиком.

Если вы являетесь администратором сервера или обслуживаете свой собственный сервер с установленным файрволом, вы, скорее всего, получали письма от файрвола о файле wp-cron.php, работающего в течение долгого периода времени. Это происходит, когда время выполнения скрипта задано больше 60 секунд. Поскольку процесс не завершается, и запускаются новые процессы, получается нехорошая ситуация с несколькими запущенными экземплярами процесса WP-Cron.

Этого не бывает на сайтах с низким уровнем трафика, однако если на ваш WP-сайт в некоторый промежуток времени одновременно зайдут пользователи, и максимальное время выполнения скрипта будет установлено слишком высоким, то в таком случае могут запуститься несколько экземпляров функции WP-Cron. До недавней версии WordPress постоянно происходили проблемы с вызовом многократных cron-процессов для одних и тех же событий.

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

Проблема вторая: запланированные записи не публикуются.

Другая популярная проблема, о которой сообщали многие хостинг-провайдеры и владельцы сайтов с очень низким уровнем трафика — отсутствие публикации запланированных записей. Функция WP-Cron запускается только при запросе страницы, поэтому если нет запросов, то и запланированные задачи не выполняются.

Примечание: это проблема не с WP. Начиная с версии 3.x, эта проблема практически не встречается. На данный момент существует много плагинов, которые позволяются справиться с этой неприятностью.

Проблема третья: WP-Cron не работает

Опять же, эта проблема связана с настройками сервера. В результате неправильно подобранных настроек файрвол блокирует выполнение необходимых для запуска WP-Cron скриптов.

Возможное решение популярных проблем с WP-Cron

Чтобы избежать появления многократных экземпляров WP-Cron, запущенных на вашем сервере для одного сайта, можно использовать стандартный способ настройки cron задач для Linux-серверов (Apache с cPanel). Преимущества данного метода:

  • Полное управление запуском функции WP-Cron
  • Обход зацикливания
  • Снижение нагрузки на сервер (если на вашем сервере хостятся многочисленные вебсайты на базе WP)

Перед тем, как воспользоваться этим методом, убедитесь в том, что ваш веб-хост позволяет вам настраивать стандартные Linux cron задачи. Способ настройки может отличаться в зависимости от панели управления, которая предлагается вашим сервером; для данной статьи я воспользуюсь панелью cPanel, чтобы настроить задачи cron — данная панель очень популярна для серверов с системой Linux.

Шаги, которые нужно будет сделать:

  1. Отключить внутренний WP-Cron, запускаемый при загрузке страницы.
  2. Настроить cron функцию, которая будет совершать запрос к wp-cron.php файлу с определенным интервалом времени.

Да, это очень просто реализовать. Всего лишь два шага.

Примечание: перед тем, как делать это, учтите, что отключение внутреннего планировщика WP-Cron может привести к тому, что ваш веб-сайт или ваши плагины будут некорректно работать.

1. Отключение внутренней функции WP-Cron.

Открываем файл wp-config.php в любом текстовом редакторе и добавляем в него две следующих строки:

01 //Disable internal Wp-Cron function

02 define('DISABLE_WP_CRON', true);

Это предотвратит выполнение внутренней функции WP-Cron. Файл wp-cron.php не будет вызываться.

2. Устанавливаем аутентичную cron функцию из вашей панели управления хостинга.

Если у вас есть возможность настройки cron задач, то тогда сделайте это следующим образом:

01 wget http://www.server.com/wp-cron.php > /dev/null 2>&1

Делаем все это из панели cPanel

1. Входим в свой аккаунт cPanel

Обычно ссылка имеет вид http://yourwebsite.com/cpanel или http://yourwebsite.com:2082. Как только вы введете id пользователя и пароль и войдете в панель управления, перейдите к секции Advanced.

2. Переходим к странице настроек Cron.

image_02

Щелкаем по иконке Cron Jobs в секции Advanced.

3. Настраиваем задачи Cron.

image_03

На новой странице вы найдете раздел Add New Cron Job. В списке Common Settings выбираем «Every 5 minutes…». Как только вы выберете этот пункт, все остальные поля будут автоматически заполнены необходимой информацией. На следующем шаге я объясню, почему я выбрал именно 5-минутный интервал запуска скрипта.

В поле command вводим следующую строку (не забудьте указать корректный адрес сайта):

01 wget http://www.yourwebsite.com/wp-cron.php > /dev/null 2>&1

Теперь щелкаем по кнопке Add New Cron Job.

Начиная с этого момента, сервер будет совершать запрос к файлу wp-cron.php каждые пять минут. Теперь о причине, по которой я задал именно 5 минут. Это сделано для того, чтобы можно было загрузить крупные файлы изображений, бэкап-процессы и т.д. Однако вы всегда можете изменить настройки и задать, скажем, запуск cron каждую минуту.

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

Источник: wp.tutsplus.com