WordPress: отключение задач CRON, если wp-cron.php грузит сервер

Автор: | 09/25/2012
 

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

Пример выполнения такой задачи можно увидеть в server-status, если он включен. Если не включен — то включить его можно по этой>>> статье.

Сам пример:

8-2 — 0/0/2 . 0.03 75525 5798 0.0 0.00 0.00 77.120.106.40 l2db.com.ua POST /wp-cron.php?doing_wp_cron=1348513272.78116106986999511718

Если выполнение этого файла вызывает нездоровую нагрузку на сервер — можно отключить эти задачи. Для этого в файл конфигурации WordPress wp-config-php добавляем строку:

define(‘DISABLE_WP_CRON’, true);

Добавить её можно где-то после установки языка, т.е. после строки

define(‘WPLANG’, ‘ru_RU’);

Другой вариант решения — в самом файле wp-cron.php закомментировать строку:

//ignore_user_abort(true);

Данная функция продолжает выполнение скрипта даже при превышении им параметра max_execution_time для PHP.

И наиболее правильный вариант — выполнять wp-cron.php системным кроном, во время наименьшей нагрузки на сервер.

Для этого — выключаем wp-cron.php в конфигурации WordPress, как описано в самом начале статьи.

Далее — создадим в текстовом редакторе файл cron.sh, разместим его в домашнем каталоге пользователя. Например у меня это будет /usr/local/www/users/l2db. Добавим в него такое содержимое:

#!/usr/local/bin/bash
/usr/local/bin/wget  -O /dev/null -q http://l2db.com.ua/wp-cron.php

В Linux путь к wget-у будет скорее всего /usr/bin/wget. Аналогично с bash или sh. Проверить можно командой:

# whereis wget

Установим владельцем файла пользователя, которому принадлежит виртуалхост с сайтом:

# chown l2db:l2db cron.sh

Разрешим выполнение файла:

# chmod u+x cron.sh

Так мы разрешаем запуск файла только самому пользователю.

Теперь, находясь в консоли под нужным пользователем, выполняем:

$ crontab -e

И добавляем 2 строки:

MAILTO=root
0     05     *     *     *     /usr/local/www/users/l2db/cron.sh

Первая нужна для того, что бы после выполнения cron-а нам приходило письмо в случае ошибки при выполнении, вторая — запускает файл /usr/local/www/users/l2db/cron.sh от имени пользователя l2db каждый день в 5 часов утра.

Проверить выполнение задачи можно в файле лога cron:

# cat /var/log/cron | grep l2db
Sep 26 10:14:00 akira /usr/sbin/cron[14107]: (l2db) CMD (/usr/local/www/users/l2db/cron.sh)

И проверим лог веб-сервера Apache на предмет выполнения самого файла wp-cron.php:

# tail -f /var/log/apache/l2db.com.ua-access.log | grep cron
77.120.106.40 — — [26/Sep/2012:10:14:00 +0300] «GET /wp-cron.php HTTP/1.0» 200 — «-» «Wget/1.13.4 (freebsd9.0)»

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

Инструкия по применению системного крона — тут>>>.