@vdovin75

Почему долго отрабатывает функция session_start() в PHP при третьем и последующем одновременном запросе?

Есть простой код:

<?php
$microtime = microtime(true);
session_start();
print ( microtime(true) - $microtime );
sleep(10);
?>

Открываю в браузере 5 вкладок и 5 раз запускаю этот скрипт на одновременное выполнение. Первые две запущенные вкладки показывают, что функция session_start() отрабатывает за 1 милисекунду. Третья вкладка - 10 секунд! Четвертая - 20 секунд! Пятая - 30 секунд! Получается, что начиная с третьей копии, функция ждет, пока завершится работа предыдущих?

Немного изменяю код, чтобы каждый раз была новая сессия:

<?php
$microtime = microtime(true);
session_name( "my_" . rand(100000, 999999) );
session_start();
print ( microtime(true) - $microtime );
sleep(10);
?>

Задержка пропадает, т.е. все пять запущенных копий выполняются параллельно, друг друга не ждут, и функция session_start() в них выполняется одинаково быстро - примерно за 1 милисекунду.

В чем может быть причина такой задержки? Может, есть какие-то настройки для PHP, ограничивающие количество одновременных процессов для одной сессии? Проверял на PHP - 5.5.3 и 5.2.1.

В интернете искал, находил подобные вопросы еще аж для PHP 4, но ответа на вопрос так и не нашел.

Спасибо всем, кто натолкнет на мысль, в какую сторону искать.
  • Вопрос задан
  • 4692 просмотра
Решения вопроса 2
@Hint
Запросы с одной сессией не могут выполняться параллельно. Файл с данными сессии блокируется на время исполнения скрипта (с момента session_start и до момента закрытия сессии, например, функцией session_write_close). Как иначе можно защититься от одновременного изменения данных сессии несколькими копиями скрипта? А так есть гарантия, то данные сессии не находятся в промежуточном состоянии.
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
session_start блокирующий вызов. При старте сессии ставится блокировка на этот SID и все другие запросы с этим SID будут ждать, пока блокировка не освободится.

Как иначе вы сможете обеспечить простоту и непротиворечивость данных?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Masterme
Копайте в сторону "где по умолчанию ПХП хранит сессии?"
Ответ написан
Комментировать
@vdovin75 Автор вопроса
Да, я проверял. В соответствующей папке создается временный файл. Да и кроме того, первые две копии скрипта отрабатывают нормально. Задержка идет только начиная с третьей. Если бы была какая-либо блокировка файла, то тогда и вторая бы тоже работала с задержкой. Так мне рассуждается.
Ответ написан
Комментировать
@vdovin75 Автор вопроса
Большое спасибо за ответы! Я тоже думал в эту сторону, смутило только, что вторая копия скрипта отрабатывала быстро, поэтому вариант блокировки был отсеян.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы