ProfiPHPProfiPHP
Категория: Полезное в PHP

Решение проблемы блокировки сессий

Работа с сессиями представляет собой огромный механизм, который кроме хранения уникальной информации для отдельных пользователей имеет много нюансов. Необходимо крайне внимательно отнестись к теме блокирования сессий, потому что это может быть основной причиной значительного замедления работы сценариев.

При работе с сессиям можно заметить ситуацию, что несколько асинхронных запросов к 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 используется сервис кэширования данных в оперативной памяти.

Добавить комментарий

Имя:
Текст комментария: