Открываю в браузере 5 вкладок и 5 раз запускаю этот скрипт на одновременное выполнение. Первые две запущенные вкладки показывают, что функция session_start() отрабатывает за 1 милисекунду. Третья вкладка - 10 секунд! Четвертая - 20 секунд! Пятая - 30 секунд! Получается, что начиная с третьей копии, функция ждет, пока завершится работа предыдущих?
Немного изменяю код, чтобы каждый раз была новая сессия:
Задержка пропадает, т.е. все пять запущенных копий выполняются параллельно, друг друга не ждут, и функция session_start() в них выполняется одинаково быстро - примерно за 1 милисекунду.
В чем может быть причина такой задержки? Может, есть какие-то настройки для PHP, ограничивающие количество одновременных процессов для одной сессии? Проверял на PHP - 5.5.3 и 5.2.1.
В интернете искал, находил подобные вопросы еще аж для PHP 4, но ответа на вопрос так и не нашел.
Спасибо всем, кто натолкнет на мысль, в какую сторону искать.
Запросы с одной сессией не могут выполняться параллельно. Файл с данными сессии блокируется на время исполнения скрипта (с момента session_start и до момента закрытия сессии, например, функцией session_write_close). Как иначе можно защититься от одновременного изменения данных сессии несколькими копиями скрипта? А так есть гарантия, то данные сессии не находятся в промежуточном состоянии.
session_start блокирующий вызов. При старте сессии ставится блокировка на этот SID и все другие запросы с этим SID будут ждать, пока блокировка не освободится.
Как иначе вы сможете обеспечить простоту и непротиворечивость данных?
Да, я проверял. В соответствующей папке создается временный файл. Да и кроме того, первые две копии скрипта отрабатывают нормально. Задержка идет только начиная с третьей. Если бы была какая-либо блокировка файла, то тогда и вторая бы тоже работала с задержкой. Так мне рассуждается.
Большое спасибо за ответы! Я тоже думал в эту сторону, смутило только, что вторая копия скрипта отрабатывала быстро, поэтому вариант блокировки был отсеян.