Планировщик Cron
WordPress имеет встроенную поддержку планирования задач, что позволяет выполнять определенные процессы в фоновом режиме в назначенное время. WordPress «из коробки» выполняет следующие запланированные задачи:
- Автоматические обновления, выпускаемые основной командой WordPress для устранения уязвимостей безопасности.
- Проверьте, установлена ли на WordPress последняя стабильная версия.
- Проверить наличие обновлений плагинов
- Проверьте наличие обновлений темы
- Опубликуйте все запланированные посты для будущего выпуска
Однако система cron, встроенная в WordPress, сама по себе не является наиболее производительной или точной. Запланированные задачи в WordPress запускаются в течение жизненного цикла запроса страницы, поэтому, если ваш сайт WordPress не получает никаких посещений в течение определенного периода времени, никакое событие cron не будет запущено в течение этого времени.
Это особенно актуально для сайтов, использующих кэширование страниц, например, кэш Nginx FastCGI. При включенном кэшировании страниц WordPress больше не обрабатывает каждый запрос страницы, если кэш страницы попадает в кэш. Это означает, что cron не будет запускаться, пока кэш страницы не истечет. Если вы настроили кэш на истечение срока действия через 60 минут, это может не быть проблемой, однако, если вы кэшируете в течение более длительного периода времени, это может быть проблематично.
Использование запросов страниц для выполнения cron также проблематично на сайтах без кэширования страниц, которые получают большой трафик. Проверка необходимости выполнения cron при каждом запросе страницы обременительна для ресурсов сервера, а несколько одновременных запросов могут привести к многократному выполнению cron.
Чтобы преодолеть эти проблемы, cron следует настроить с помощью демона операционной системы (фоновый процесс), доступного в Linux и всех системах на базе Unix. Поскольку cron работает как демон, он будет работать на основе системного времени сервера и больше не требует посещения пользователем сайта WordPress.
Перед настройкой cron рекомендуется отключить автоматическую обработку cron в WordPress. Добавьте следующую строку в файл wp-config.php:
define('DISABLE_WP_CRON', true);
Знакомство с Crontab
Запланированные задачи на сервере добавляются в текстовый файл crontab, и каждая строка в файле представляет одно событие cron. Если вы размещаете несколько сайтов на своем сервере, вам понадобится одно задание cron на сайт, и следует рассмотреть возможность поочередного выполнения многих заданий cron, чтобы избежать их одновременного запуска и перегрузки вашего процессора.
Начните с подключения к вашему серверу.
ssh [email protected]
Откройте crontab с помощью следующей команды. Если вы открываете crontab в первый раз, вам может быть предложено выбрать редактор. Nano обычно самый простой.
crontab -e
Я не буду вдаваться в подробности синтаксиса crontab, но добавление следующего в конец файла будет запускать WordPress cron каждые 5 минут. Не забудьте обновить путь к файлу, чтобы он указывал на вашу установку WordPress, и повторить запись для каждого сайта.
*/5 * * * * cd /home/user/example.com/public; /usr/local/bin/wp cron event run --due-now >/dev/null 2>&1
В некоторых статьях предлагается использовать wget
или curl
для запуска cron, но рекомендуется использовать WP-CLI. И wget, и cURL отправляют запросы через Nginx и подчиняются тем же ограничениям по времени, что и веб-запросы. Однако вы можете захотеть, чтобы ваши новые задания cron выполнялись в течение более длительного времени. При запуске WordPress cron через WP-CLI ограничений по времени нет, он будет выполняться до завершения.
Эта часть >/dev/null 2>&1
гарантирует, что никакие электронные письма не будут отправлены на учетную запись пользователя Unix, инициирующего планировщик заданий WordPress cron.
Сохраните файл, нажав CTRL+X, а затем Y.
Cron теперь настроен с помощью инструмента cron системы Unix. Мы проверим, что он работает правильно, позже.
Электронная почта
Почтовые серверы печально известны своей сложностью в настройке. Вам не только нужно убедиться, что письма успешно попадают в почтовые ящики получателей, но и подумать, как вы будете справляться со спамом и вирусами (отправляемыми в виде вложений к письмам). Установка необходимого программного обеспечения для запуска собственного почтового сервера также может поглотить ценные системные ресурсы и потенциально открыть ваш сервер для большего количества уязвимостей безопасности.
Я не рекомендую вам настраивать сервер для обработки электронной почты, а вместо этого использовать надежного поставщика услуг, например Google Workspace. Однако WordPress все равно должен отправлять исходящие письма:
- Уведомления администратора
- Регистрация новых пользователей
- Сброс пароля
- Автоматические уведомления об обновлениях
И это только ядро WordPress. Добавьте новые плагины в смесь, и объем и важность писем, отправляемых с вашего сайта, могут резко возрасти. Подумайте о WooCommerce и заказывайте квитанции.
Исходящая электронная почта
Мы рекомендуем выбрать надежный плагин WordPress для отправки электронной почты и связать его с вашим любимым сервисом отправки транзакционной электронной почты. Ищите плагин с очередью отправки, который обрабатывает сбои лучше, чем просто добавление записи в ваш журнал ошибок.
WP Offload SES — хороший выбор, как и WP Mail SMTP. Если ваш сайт отправляет очень мало почты, настройка SMTP с использованием Gmail (или любого другого провайдера, которого вы используете для электронной почты) для отправки почты сайта через SMTP — неплохая опция.
Тестирование Cron и исходящей электронной почты
Чтобы проверить, что cron и исходящие письма работают правильно, я написал небольшой плагин, который будет отправлять письмо администратору каждые 5 минут. Это не то, что вы захотите держать включенным бесконечно, поэтому, как только вы убедитесь, что все работает правильно, не забудьте отключить плагин!
Создайте новый файл с именем cron-test.php
в каталоге плагинов, используя следующий код:
<?php
/**
* Plugin Name: Cron & Email Test
* Plugin URI: https://spinupwp.com/hosting-wordpress-yourself-cron-email-automatic-backups/
* Description: WordPress cron and email test.
* Author: SpinupWP
* Version: 1.0
* Author URI: http://spinupwp.com
*/
/**
* Schedules
*
* @param array $schedules
*
* @return array
*/function db_crontest_schedules($schedules) {
$schedules['five_minutes'] = array(
'interval' => 300,
'display' => 'Once Every 5 Minutes',
);
return $schedules;
}
add_filter('cron_schedules', 'db_crontest_schedules', 10, 1);
/**
* Activate
*/function db_crontest_activate() {
if (! wp_next_scheduled('db_crontest')) {
wp_schedule_event(time(), 'five_minutes', 'db_crontest');
}
}
register_activation_hook(__FILE__, 'db_crontest_activate');
/**
* Deactivate
*/function db_crontest_deactivate() {
wp_unschedule_event(wp_next_scheduled('db_crontest'), 'db_crontest');
}
register_deactivation_hook(__FILE__, 'db_crontest_deactivate');
/**
* Crontest
*/function db_crontest() {
wp_mail(get_option('admin_email'), 'Cron Test', 'All good in the hood!');
}
add_action('db_crontest', 'db_crontest');
После активации плагина вы должны вскоре получить электронное письмо. Если нет, проверьте конфигурацию crontab и настройки WP Offload SES.