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

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

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *