За последние 24 часа нас посетили 47150 программистов и 1550 роботов. Сейчас ищут 899 программистов ...

Время жизни сессии

Тема в разделе "PHP для новичков", создана пользователем slay313, 22 окт 2014.

  1. slay313

    slay313 Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    3
    Симпатии:
    0
    Доброго времени суток, возник такой вопрос по поводу времени существования сессии.
    Есть скрипт авторизации за сессиях с записью в бд отсюда - viewtopic.php?t=15658
    В php.ini следующее:
    Как сделать так, чтобы при обновлении страницы, время жизни куки так же обновлялось и при закрытии браузера, закрывалась сессия?

    Прошу прощения за столь глупый вопрос, но нигде не могу найти решения своей проблемы. Заранее спасибо.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    сессия зависит как от сессионной куки, так и от сессионного файла. рассмотрим их по отдельности:

    чтобы кука (любая, не только сессионная) жила строго до закрытия браузера, надо чтобы ее время жизни было выставлено в 0.
    если шаловливыми ручонками ничего не трогать, то у сессионной куки так и получается — время жизни = 0, т.е. кука умрет после закрытия браузера.

    я бы тебе категорически не советовал что-то менять в php.ini про сессии!!! пусть остаются значения по умолчанию. потому что они влияют на все скрипты. когда тебе понадобится изменить что-то в конкретном скрипте — меняй это в скрипте через вызов подходящей функции.
    так session.cookie_lifetime ты можешь выставить в session_set_cookie_params(), которая должна вызываться ДО session_start().

    Добавлено спустя 18 минут 4 секунды:
    что касается сессионного файла, то он обновляется на каждой странице, у которой был вызов session_start(), то есть время его жизни начинает отсчитываться заново, а не с того момента когда пользователь впервые появился.
    пока пользователь активен, его сессионный файл будет жить!

    вот если пользователь очень долго ничего не делал: браузер оставался открыт, но никаких новых страниц не открывал, то с некоторой вроятностью при следующем открытии страницы начнется "сбор мусора" и файл будет удален и несмотря на живую куку. тогда будет создан новый пустой файл.
    вероятность сборки мусора по умолчанию равна 1%. задается парой session.gc_probability/session.gc_divisor
     
  3. slay313

    slay313 Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    3
    Симпатии:
    0
    Если я в session.gc_probability устанавливаю 100%, а в session.gc_maxlifetime 20 секунд, то при обновлении страницы позже чем через 20 секунд, открывается опять авторизованная страница. Получается сессия через 20 секунд все еще открыта.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вы просто не ожидаете как именно работает сборщик мусора. во-первых шанс срабатывания еще и от дивизора зависит. во-вторых даже если это будет 1/1 то сессионный файл сначала открывается, потом читается, потом срабатывает уборка мусора убивающая фактически файл и потом происходит завершение вашей программы которая своим сохранением в сессию данных создает новый файл сессии.
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    1. вероятность задается не одним значением, а парой session.gc_probability/session.gc_divisor, как 1/10 или 1/100… при том это по прежнему вероятность, а не стопудовость )))
    2. если ты экспериментируешь под apache, после изменений в php.ini перезапусти сервер, чтобы изменения применились.
    3. для чистоты эксперимента, ты в другом браузере потыкай сессии, пока твой контрольный пользователь "спит".

    сборка мусора она одна на всех, понимаешь? бойся своих желаний.

    Добавлено спустя 3 минуты 49 секунд:
    пока писал, Ganzal уже написал примерно то же. нехай будет два раза, чтобы лучше доходило ;)
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    и собственно да. в настройках не просто так такие низкие значения. если на сайт заходит один человек в сутки или даже месяц - он постоянно будет авторизован потому что сессию некому будет убить. а если на сайте сотня пиров ежесекундно то сервак с настройками 1/1 протрет дыру в винчестере. да и просто поляжет от лишней нагрузки.

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

    slay313 Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    3
    Симпатии:
    0
    У обоих выставлены значения
    Код (Text):
    1. session.gc_probability = 100
    2. session.gc_divisor = 1000 (стоит по умолчанию)
    Каждый раз перезапускаю сервер при изменении настроек
    Ну 100 я поставил исключительно в целях эксперимента)

    Теперь я понял, как все это работает. Спасибо вам огромное за помощь и за ваши столь подробные объяснения.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Кстати, на Debian linux и его производных (Ubuntu например) всё немного иначе. Там из-за очень специфических прав на папку по-умолчанию с сессионными файлами, классический сборщик мусора не работает. Из коробки session.gc_probability = 0 то есть отключен. А вместо этого по крону работает специальный скрипт.
    Если мы сделаем пробабилити ненулевой, то PHP всё равно не сможет собрать мусор, т.к. тупо не найдет файлы. Их только root видит.
    А если мы используем свою папку с файлами вместо системной, то кроновский скрипт об этом ничего не знает и мусор там не уберет. пруф

    Вот такая фигня, малятки!