2015-07-07 3 views
0

У этой сессии настройки:Как это работает gc_maxlifetime

@ini_set('session.gc_probability', 1); 
@ini_set('session.gc_divisor', 1); 
@ini_set('session.gc_maxlifetime', 60); 
    session_set_save_handler('_sess_open', '_sess_close', '_sess_read', '_sess_write', '_sess_destroy', '_sess_gc'); 
function _sess_gc($maxlifetime) { 
     echo "GC started"; 
    } 

Насколько я понимаю, с этим настройки сборщик мусора должен работать каждые 60 секунд (так как вероятность и делитель одинаковы). Im тестирует это сейчас и странно, что GC запускается каждый раз, когда обновляется веб-сайт, он не ждет, пока не пройдет 60 секунд от предыдущего вызова. Это немного сбивает меня с толку, я понимаю что-то не так?

ответ

1

session.gc_probability/session.gc_divisor = х

В вашем случае х = 1 (= 100% шанс)

Это означает, что сборщик мусора будет работать на каждый запрос. Это каждый запрос, который кто-либо делает.

Сборщик мусора ТОЛЬКО удаляет файлы сеанса, которые являются устаревшими и имеют право на удаление, а не файлы, которые были недавно изменены. То, что считается устаревшим, определяется session.gc_maxlifetime

+0

ОК. Но какие файлы сеанса точно будут удалены? У меня есть данные сеансов, хранящиеся в БД. и у меня есть моя собственная функция очистки, например: function _sess_gc ($ maxlifetime) { DB :: exec ("delete from table_sessionswhere expiry <". time()); }. Поэтому, если эта функция запускает каждый запрос страницы, это gc_maxlifetime не имеет для меня значения – abiku

+0

Если вы используете свое собственное хранилище сеансов (например, в базе данных), сбор мусора, который вы опубликовали, бесполезен. Построй свой собственный. Просто добавьте в свою базу данных временную метку и обновите ее всякий раз, когда вы обновляете сеанс. Затем добавьте код, который иногда очищает таблицу, ища старые сеансы. ВЫ должны выполнить это самостоятельно. Итак: просто добавьте код в функцию _sess_gc, которая удаляет старые записи. –

+0

Да, но не все функции gc бесполезны. Im использует gc_divisor и gc_probability, чтобы установить, как запустить функцию _sess_gc. Я установил только дату истечения срока действия, не основанную на gc_maxlifetime. Или я могу сделать это так, как вы предложили, т. Е. Проверить временную метку сеанса при ее сохранении. – abiku

1

GC не всегда запускается по каждому запросу, по умолчанию настройки PHP состоят в том, что для запуска GC требуется 1%. session.gc_probability (по умолчанию 1)/session.gc_divisor (по умолчанию 100) = 0,01 (1% шанс)

Соответствующий ручной ввод: http://php.net/manual/en/session.configuration.php#ini.session.gc-probability

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

Я думаю, вы также должны попробовать добавить это внутри своего _sess_open после того, как вы начали свою сессию. После session_start() линии добавить

session_write_close(); // dump $_SESSION out to file, close file, release lock.

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

Смежные вопросы