В DLE существует проблема блокировки сессий.
На каждом запросе выполняется session_start()
, который открывает сессию, ставит блокировку и держит ее до завершения запроса.
Если сессия уже заблокирована, все остальные бесконечно ждут когда смогут захватит блокировку.
Типичный сценарий:
- Пользователь делает запрос который по каким то причинам долго выполняется.
- Сессия пользователя блокируется.
- Пользователь продолжает делать запросы к сайту.
- Процессы начинают вставать в ожидание на блокировку.
- Количество процессов упирается в лимит, сайт перестает отвечать на любые запросы всех пользователей.
Чтобы такого не происходило, необходимо организовать работы с сессиями так, чтобы блокировка осуществлялось минимально необходимое время. Например:
- В начале запроса в
session_start()
можно добавить опциюread_and_close => TRUE
. В этом случае данные сессии прочитаются, сессия закроется и блокировка будет сразу снята. - Если реализован п.1, то перед каждой записью в сессию необходимо стартовать сессию заново, записывать данные и сразу закрывать ее через
session_write_close()
.