Работа с сессиями представляет собой огромный механизм, который кроме хранения уникальной информации для отдельных пользователей имеет много нюансов. Необходимо крайне внимательно отнестись к теме блокирования сессий, потому что это может быть основной причиной значительного замедления работы сценариев.
При работе с сессиям можно заметить ситуацию, что несколько асинхронных запросов к PHP скрипту выстраиваются в очередь вместо того, чтобы отрабатываться параллельно.
Для примера создадим и запустим 2 файла:
<?php session_start( ); $_SESSION['color'] = 'Green'; sleep( 5 ); // Выполняем код ?>
и второй файл:
<?php session_start( ); // Выполняем код ?>
При параллельном запросе, начиная с первого файла, второй файл будет в очереди на обработку данных в связи из заблокированным файлом сессии первым кодом, и выполниться только после его завершения, а именно через 5 секунд.
Если в директиве Session.save_handler в качестве обработчика используется Files, тогда данные конкретной сессии хранятся в одном единственном файле, который оказывается заблокированным с момента вызова функции Session_start и до окончания работы скрипта.
Для решения проблемы с блокировкой файла сессии, необходимо использовать функцию Session_write_close:
<?php session_start( ); $_SESSION['color'] = 'Green'; session_write_close( ); sleep( 5 ); // Выполняем код ?>
При данной реализации, функция Session_write_close сразу запишет данные и завершит текущую сессию, тем самым освободив ее для использования другими процессами.
Для решения проблемы также можно изменить обработчика, который используется для хранения и извлечения данных, связанных с сессией. Кроме установленного по умолчания Files можно установить значение MM, которое означает, что данные сессии будут обрабатываться RAM памятью. С опцией SQLite используется база данных SQLite. С пользовательской опцией User можно использовать пользовательские функции для обработки сессии. Для значения Memcache используется сервис кэширования данных в оперативной памяти.