Поборол довольно интересный глюк, возникающий при работе «связки» из WordPress, Apache и nginx.
Для начала расскажу, как в WordPress устроен «планировщик». Естественно, многие хостеры всячески ограничивают доступ пользователя к системе. Поэтому выполняемые на хостинговых аккакунтах скрипты не могут полагаться на такие вещи, как cron — стандартный юниксовый планировщик задач. Кстати, некоторые извращенцы запускают WordPress под Windows, где никакого крона нет и никогда не было.
Разработчики скриптов извращаются, как могут. Например, в WordPress все устроено следующим образом: при обращении к страницам сайта вызывается функция spawn_cron(), которая, если имеются «запланированные» события, в свою очередь обращается GET-запросом к файлу wp-cron.php, используя fsockopen(). ИМХО, механизм более чем странный, но почему-то использующийся.
Мое внимание привлекло большое количество ошибок 499, которые awstats определял, как Unknown Error, в статистике сайта. Оказалось, что они возникают из-за наличия у хостера nginx, который не перенаправляет запрос Apache, если соединение было закрыто слишком быстро — раньше, чем сервер успел прочесть заголовки. При этом в лог пишется 499 ошибка.
Естественно, wp-cron.php не запускается, что несколько бесит. Например, не работает автоматическое создание бекапа базы данных по расписанию.
Как лечить досадное недоразумение? Необходимо всего лишь исправить файл wordpress-dir/wp-includes/cron.php — перед выходом из функции spawn_cron() добавить небольшую задержку.
Было:
function spawn_cron() {
//skipped some code
if ( $argyle )
fputs( $argyle,
"GET {$parts['path']}?check=" . wp_hash('187425') . " HTTP/1.0\r\n"
. "Host: {$_SERVER['HTTP_HOST']}\r\n\r\n"
);
}
Стало:
function spawn_cron() {
//skipped some code
if ( $argyle )
fputs( $argyle,
"GET {$parts['path']}?check=" . wp_hash('187425') . " HTTP/1.0\r\n"
. "Host: {$_SERVER['HTTP_HOST']}\r\n\r\n"
);
usleep(100000); //100ms wait for nginx
}
После такого патча wp-cron работает нормально.
С Днем Рождения!
Спасибо за статью. Я пишу плагин, работающий на кроне и читаю всё, что с этим может быть связано.
А 100 ms не мало?
Зависит от загруженности сервера. У меня сейчас стоит 0,5 секунды.
Вот, кстати, по поводу этого же багфикса в версиях WP >= 2.7:
http://shura.luberetsky.ru/2009/04/18/wordpress-27-i-nginx/
С днем рождения! Желаю здоровья и счастья, удачи и успехов!
С Днюхой!
Версия 2.8.4
Симптомы такие же.
отложенные публикации пропускаются и база не бэкапится (плагин для wp)
Где и что нужно изменить? Заранее спасибо.
http://shura.luberetsky.ru/2009/04/18/wordpress-27-i-nginx/
В версии 2.8 все аналогично.