Проблема с функцией session_start() (медленно работает)

У меня проблема с 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. Или, может быть, есть какие-то «замки» на файлы с информацией о сеансе.

Может быть, кто-то уже сталкивался с такой проблемой и может помочь ее решить.


person Alex    schedule 16.12.2009    source источник
comment
Связанный stackoverflow.com/q/13772074/168034   -  person phunehehe    schedule 22.09.2014


Ответы (1)


Файл, содержащий информацию о сеансе, блокируется на время, пока PHP обслуживает запрос.

Таким образом, если у вас есть один PHP-скрипт (использующий сеанс), который в данный момент выполняется, и тот же пользователь отправляет другой запрос, второй запрос будет ожидать завершения первого.

person Pascal MARTIN    schedule 16.12.2009
comment
Я только что обнаружил, что есть еще один запрос к серверу, который начинается после загрузки всей страницы. Итак, файл сеанса действительно был заблокирован, но я не мог определить, где именно. Вот почему я подумал о настройках apache. Большое спасибо, Паскаль. - person Alex; 16.12.2009
comment
Спасибо, Паскаль Мартин, из-за этого у меня возникла огромная проблема с производительностью. Итак, если у вас есть file1.php с session_start(); sleep(10); и вы запускаете второй скрипт file2.php, он также будет ждать этого сна из file1. - person adrianTNT; 19.08.2013