Skip to content

Instantly share code, notes, and snippets.

@antage
Last active August 9, 2020 18:25
Show Gist options
  • Save antage/885da0f11c6327f18f034ec4c5704dd7 to your computer and use it in GitHub Desktop.
Save antage/885da0f11c6327f18f034ec4c5704dd7 to your computer and use it in GitHub Desktop.
Session blocking

В DLE существует проблема блокировки сессий. На каждом запросе выполняется session_start(), который открывает сессию, ставит блокировку и держит ее до завершения запроса. Если сессия уже заблокирована, все остальные бесконечно ждут когда смогут захватит блокировку.

Типичный сценарий:

  1. Пользователь делает запрос который по каким то причинам долго выполняется.
  2. Сессия пользователя блокируется.
  3. Пользователь продолжает делать запросы к сайту.
  4. Процессы начинают вставать в ожидание на блокировку.
  5. Количество процессов упирается в лимит, сайт перестает отвечать на любые запросы всех пользователей.

Чтобы такого не происходило, необходимо организовать работы с сессиями так, чтобы блокировка осуществлялось минимально необходимое время. Например:

  1. В начале запроса в session_start() можно добавить опцию read_and_close => TRUE. В этом случае данные сессии прочитаются, сессия закроется и блокировка будет сразу снята.
  2. Если реализован п.1, то перед каждой записью в сессию необходимо стартовать сессию заново, записывать данные и сразу закрывать ее через session_write_close().
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment