Способ, которым я делаю это на нашей CMS, заключается в запуске setTimeout при загрузке страницы. Это - через 20 минут перенаправляет пользователя на страницу, которая очищает сеанс и, следовательно, выходит из системы пользователя. К сожалению, это имеет один побочный эффект: когда у пользователя открыто более одного окна, иногда одно окно может достичь периода ожидания до того времени, когда пользователь активен. Это приводит к преждевременному истечению времени ожидания сеанса и прерыванию потока.
Одним из способов обхода этого предостережения может быть сохранение идентификатора активности для каждого действия, которое выполняет пользователь (т.е. создание элемента содержимого, загрузка изображения). Этот идентификатор активности хранится в пользовательской таблице, и таймер тайм-аута (в Javascript) может проверить этот идентификатор, чтобы увидеть, является ли окно, для которого истекло время ожидания, последним активным окном или нет. Если идентификатор в этом окне (переданный, скажем, из переменной PHP в вывод HTML) не совпадает, то он не вызывает тайм-аут сеанса.
Это довольно сложный подход без внесения критических изменений в интерфейс.