@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, но ответа на вопрос так и не нашел.

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

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

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 05:01
999999 руб./за проект
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект