У меня проблема с session_start()
на основном сервере. Когда я загружаю страницу в первый раз, выполнение запроса занимает менее 1 секунды. Если я подожду примерно 12-15 секунд, а затем перезагружу страницу, время загрузки будет таким же. Но когда я пытаюсь обновить страницу, например, через 3 или 5 секунд после первоначальной загрузки, время ответа сервера равно 10 секундам.
Я сделал несколько тестов, чтобы определить узкое место в моем скрипте, и обнаружил, что функция session_start()
выполняется 9,8 секунды. Я использую пакет PEAR HTTP_Session2. Вот фрагмент кода:
HTTP_Session2::useCookies(SESSION_USE_COOKIE);
/* Next line was added to make logging of execution time possible. */
self::writeToFile('HTTP_useCookies(1) -> '.self::getWorkTime());
HTTP_Session2::start("SID");
self::writeToFile('HTTP_start(2) -> '.self::getWorkTime());
HTTP_Session2::setExpire(time() + SESSION_EXPIRE);
self::writeToFile('HTTP_setExpire(3) -> '.self::getWorkTime());
Текст журналов:
//First loading (13:34:35)
HTTP_useCookies(1) -> 0.00038
HTTP_start(2) -> 0.00077
HTTP_setExpire(3) -> 0.00090
// Second loading (13:34:39)(4 seconds later)
HTTP_useCookies(1) -> 0.00029
HTTP_start(2) -> <<<<<< 10.80752 >>>>>
HTTP_setExpire(3) -> <<<<<< 10.80780 >>>>>
//Third loading (13:34:56)
HTTP_useCookies(1) -> 0.00041
HTTP_start(2) -> 0.00071
HTTP_setExpire(3) -> 0.00083
Итак, я обнаружил, что проблема в функции HTTP_Session2::start()
. Код функции HTTP_Session2::start()
:
public function start($name = 'SessionID', $id = null)
{
self::name($name);
if (is_null(self::detectID())) {
if ($id) {
self::id($id);
} else {
self::id(uniqid(dechex(rand())));
}
}
session_start();
if (!isset($_SESSION['__HTTP_Session2_Info'])) {
$_SESSION['__HTTP_Session2_Info'] = self::STARTED;
} else {
$_SESSION['__HTTP_Session2_Info'] = self::CONTINUED;
}
}
Я не могу понять, в чем причина задержки времени. Возможно, на сервере неправильные настройки Apache. Или, может быть, есть какие-то «замки» на файлы с информацией о сеансе.
Может быть, кто-то уже сталкивался с такой проблемой и может помочь ее решить.