0
26.12.200818:2926.12.2008 18:29:07
Сегодня разбирались в проблеме с производительностью на одном из сайтов - на некоторых хитах страница собиралась до 30 секунд. Причем проблема наблюдалась эпизодически - то 1.5 секунды, то 20.
Стали отлаживать и докопались до вызова session_start() в main/include.php - львиная доля всего времени сборки страницы в "проблемных" случаях приходилось именно на вызов этой функции.
Затем обратили внимание на закономерность - проблема возникала тогда, когда мы запрашивали страницу через очень короткий (2-3 секунды) промежуток времени после того, как отобразилась предыдущая страница сайта.
Заглянули в Fiddler - около десятка "битых" ссылок на .gif-ки, видимо - в шаблоне сайта. При этом по запросам сервер отдает контент нашей /404.php
Таким образом, подходим к разгадке: при запросе страницы выполняется с десяток запросов на несуществующие страницы, сервер отдает 404-ю ошибку, которая перехватывается нашим обработчиком (nginx либо не используется, либо обработка 404 статуса происходит на уровне Apache). Каждый из этих запросов блокирует сессию и, пока все они не будут обработаны, session_start() на странице, которую мы запросим через непродолжительное время, будет ожидать разблокировки, что займет несколько секунд.
Резюмируя: "битые" ссылки на изображения и иную статику в коде страницы могут приводить к тому, что при достаточно быстром переходе пользователя от одной страницы к другой, время формирования страниц вырастает до неприемлемых величин.
P.S. Этот пост ни в коем случае не отменяет того факта, что обычно большое время сборки страницы приходится на выполнение "тяжелых" SQL-скриптов - "Разработка"/"Отладка" вам в помощь!