Периодически владельцы сайтов на wordpress начинают жаловаться на повышенную нагрузку создаваемую файлом wp_cron.php. В access-логе сервера это выглядит вот так:
192.168.0.1 - - [14/Dec/2014:23:11:45 +0200] "POST /wp-cron.php?doing_wp_cron=xxxxxxxxx.yyyyyyyyyyy HTTP/1.0" 200 0 "-" "WordPress/4.0.1;
192.168.0.1 - - [14/Dec/2014:23:13:28 +0200] "POST /wp-cron.php?doing_wp_cron=xxxxxxxxx.yyyyyyyyyyy HTTP/1.0" 200 0 "-" "WordPress/4.0.1;
И таких записей может быть несколько тысяч.
Для чего нужен wp-cron.php?
wp-cron.php — это, по сути, автоматизированный суррогат настоящего крона для случаев, когда сайт размещён на каком-нибудь убогом хостинге, не разрешающем использовать crontab («Планировщик задач») и предназначен для выполнения рутинных автоматических задач вроде публикации записей с отложенным временем публикации, очистка «корзины», отправка уведомлений (pingbacks) блогам упомянутым на сайте, очистка кеша и так далее.
С одной стороны — это хорошо, так как независимо от прямоты рук автора сайта и качества хостинга все эти, без сомнения, жизненно важные задачи будут выполняться. С другой же стороны — необоснованно частый вызов скрипта wp-cron.php в процессе работы сайта приводит к повышенной нагрузке на сервер, замедлению работы сайта.
Как устранить ошибку с нагрузкой от wp-cron.php?
Откройте файл wp-config, который расположен в папке сайта и после строки define (‘WPLANG’, ‘ru_RU’); или $table_prefix = ‘wp_’; (не принципиально) добавьте новую строку:
define('DISABLE_WP_CRON', true);
Это отключит самовольное выполнение псевдокрона и снизит нагрузку.
Обязательно после этого в «планировщике задач» (cron) Вашего хостинга добавьте задачу в виде:
0 */2 * * * /usr/bin/wget -O - -q -t 1 'http://имясайта.com/wp-cron.php?doing_wp_cron'
где,
www.имясайта.com — это адрес Вашего сайта.
Но общая суть такова — нужно через wget или curl открывать ссылку http://имясайта.com/wp-cron.php?doing_wp_cron с периодичностью раз в несколько часов.
Чем выше создаваемая нагрузка — тем реже нужно запускать задачу
Всё. В большинстве случаев — этого более чем достаточно для устранения ошибки.
Строки define (‘WPLANG’, ‘ru_RU’) нет. Что делать?
В этом случае можно попробовать добавить директиву сразу после
define(‘DB_COLLATE’, ‘ ‘);