Представитель Шуры Люберецкого в ЖЖ (brat_luber) wrote,
Представитель Шуры Люберецкого в ЖЖ
brat_luber

Category:

Связка Wordpress+Apache+nginx

Поборол довольно интересный глюк, возникающий при работе “связки” из 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 работает нормально.

Запись опубликована в блоге Шуры Люберецкого. Вы можете оставлять свои комментарии там, используя свое имя пользователя из ЖЖ (вход по OpenID).

Tags: сайтоводство
Subscribe

  • Что-то к хвостику прилипло

    Цитату я взял из замечательного анекдота, прочитанного в комментариях у ex0_planet. Но он прекрасно отражает сущность некоторых “шилдов…

  • С праздником всех причастных!

    –. . -. .-. .. …. –. . .-. -.-. Запись опубликована в блоге Шуры Люберецкого. Вы можете оставлять свои комментарии там,…

  • Ригонда-102

    Восстанавливаю, хотя это громко сказано, скорее – занимаюсь мелким профилактическим обслуживание – радиолу “ Ригонда-102“,…

Comments for this post were disabled by the author