php Блокировка сессии -- в чем причина, как это работает. "Почему все страницы сайта начинают зависать"

Как проявляется проблема

Проблема касается обычно обслуживания частых или одновременных запросов одного пользователя -- вы запрашивает скрипт, который долго "не отпускает" сессию, и все другие скрипты, запрошенные этим пользователем и тоже работающие с сессией виснут.

Причины блокировок

Причины следующие:

  • По умолчанию php хранит сессии в файлах
  • После того как вызвана session_start() файл данной сессии (файлы других сессий тут ни при чем) блокируется скриптом и не разблокируется до тех пор, пока не данные скрипт не завершится или не вызовет session_write_close().

Как исправить/избежать блокировки сессий

Сразу закрывать сессию, после проделанных с ней операций (т.е. писать код иначе)
Использовать нестандартное хранилище сессий, в котором нет блокировок (например redis)

Подробности: https://secure.php.net/manual/ru/session...

melisa's picture

  1. Сразу закрывать сессию, после проделанных с ней операций

    - что это означает фактически?
    Явно вызывать закрытие сессии?

    session_write_close()
  2. Не является ли само по себе ошибкой то, что скрипт "не завершается"? Есть ли смысл при этом закрывать сессию вручную вместо того, чтобы оптимизировать работу скрипта?
vedro-compota's picture

Явно вызывать закрытие сессии?

session_write_close()

да, явно вызывать закрытие сессии, напрямую или средствами фреймворка, в конечно итоге это должно приводить к вызову session_close().

Не является ли само по себе ошибкой то, что скрипт "не завершается"?

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

Есть ли смысл при этом закрывать сессию вручную вместо того, чтобы оптимизировать работу скрипта?

т.е. как было сказано выше не всегда можно её оптимизировать (если это внешняя система, разве что кешировать запросы кроном, так чтобы клиент всегда обращался к кешу, но это тоже не очень хорошо если есть задача показывать самое актуальное),
более того, другой пример:
если у вас много ajax-а значит у вас не очень простое приложение, и скорее всего в нем есть операции, которые выполняются не очень быстро, а значит механизм стандартного хранения просто приведёт к тому, что запросы, которые должны обрабатываться параллельно (для чего аякс и используют), могут начать строиться в очередь.

_____________
матфак вгу и остальная классика =)