У меня проблема с 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. Или, может быть, есть некоторые «блокировки» для файлов с информацией о сеансе.
Может быть, кто-то уже сталкивался с такими проблемами и может помочь в его решении.
Файл, содержащий информацию о сеансе, заблокирован в течение времени, когда PHP выполняет запрос.
Итак, если у вас есть один скрипт PHP (с использованием сеанса), который в настоящее время выполняется, и тот же пользователь отправляет другой запрос, второй запрос будет ждать завершения первого.