Как устроены сессии в PHP, как реализован данный механизм в MODX Revolution и как его можно улучшить
Работая над оптимизацией сайта проекта Лектория, я всегда ищу узкие места, которые в перспективе могут привести к существенным проблемам и стараюсь их в максимально короткие сроки закрывать. Одним из таких вопросов, с которыми я недавно столкнулся, оказался вопрос работы стандартного механизма обработки сессий в MODX.
}
8 минут на прочтение
Теги по теме:
- Backend
- MODX
Как я начал ковыряться в этом вопросе
Меня зовут Артем Зернов. Я веб-разработчик, занимаюсь развитием проекта Лектория, а также веду свой youtube-канал OpenModx, а еще у меня есть веб-студия OpenColour, в которой мы создаем сайты, в основном на MODX Revolution.
Как устроены сессии в PHP по-умолчанию
При посещении какой-либо веб-страницы сайта, созданного на PHP, создается сессия. При этом, если у вас в cookie нет параметра с идентификатором сессии (по-умолчанию это
В сессии хранятся данные, которые присущи только вашему визиту. Например, корзина товаров, информация о том, авторизовались ли вы для входа в личный кабинет и так далее.
Пока у вас есть в куки идентификатор сессии, сервер знает, кто вы и может показывать вам какие-либо ваши данные, хранимые в сессии.
По-умолчанию, в php есть встроенные функции session_start
https://www.php.net/manual/ru/ref.session.php
Также есть глобальный массив $_SESSION, в который вы можете записывать что угодно. MODX также записывает в него свои служебные данные.
Пока сессия открыта и пока не вызван метод session_write_close, все манипуляции с данными в $_SESSION будут сохраняться при переходах между страницами в рамках вашего посещения.
По-умолчанию, в php сессии хранятся в файлах, хранимых во временном каталоге (например /tmp).
Сессии устаревают по принципу «Если с момента последнего обращения к сессии прошло больше времени, чем укзано в настройке php session.gc_maxlifetime, то считаем ее устаревшей».
Для чего нужны сессии
Сессии — это временные хранилища, связанные с конкретным посетителем, а точнее с браузером. В сессии хранятся данные, потеря которых не несет существенных последствий.
Как и где инициализируются обработчики сессии в MODX
Прежде, чем сказать о том, как это происходит в MODX, важно сказать, что php предусматривает переопределение стандартных механизмов работы с сессиями. Это делается при помощи встроенной в php функции session_set_save_handler, с помощью которой мы можем переопределить способ чтения, записи и очистки от устаревших сессий (сборки мусора).
В MODX это происходит в методе modX::_initSession.
Стандартный механизм обработки сессий в MODX реализован в классе
Сборщик мусора и настройки gc_probability и gc_divisor
В php механизм очистки от устаревших сессий запускается в соответствии с настройками php.ini session.gc_probability и session.gc_divisor. Очистка происходит session.gc_probability раз из session.gc_divisor.
Например, если session.gc_probability = 1, а session.gc_divisor = 100
, то очистка будет происходить в одном случае из ста обращений к сайту, для того, чтобы не перегружать сервер слишком частыми процедурами очистки сессий.
Если ваш сайт посещают часто, то нужно увеличивать параметр session.gc_divisor. Например, ваш сайт посещают 1000 раз в сутки (речь идет именно об обращении к страницам, которые может делать хоть один и тот же пользователь), тогда при соотношении session.gc_probability/session.gc_divisor 1/1000 хотя бы один раз в сутки у вас будет запускаться механизм очистки от устаревших сессий.
Garbage collector
В переводе с английского означает «сборщик мусора». Сокращенно gc. Универсальное понятие, используемое в разных языках программирования, означающее механизм очистки от устаревших данных.
Как вы понимаете, механизм очистки от устаревших сессий можно запустить и самостоятельно (выше мы говорили о скрипте sessionclean). В Ubuntu этот механизм запускается каждые 30 минут. За другие ОС не скажу.
В MODX процедура очистки от устаревших сессий происходит в методе modSessionHandler::gc.
Время жизни куки и сессий
В настройках php, в php.ini есть настройка
Стоит отметить, что MODX переопределяет эти настройки, согласно своим аналогичным системным настройкам session_cookie_lifetime и session_gc_maxlifetime, поэтому в первую очередь смотрите именно в системные настройки вашего сайта на MODX.
Логично, что выставлять cookie_lifetime больше, чем gc_maxlifetime смысла нет.
Почему моя таблица modx_session весит 2Гб?
Впервые с вопросом, как работают сессии в MODX я столкнулся, когда начал замечать, что если я давно не занимался каким-либо сайтом, то на сервер, где он расположен, таблица modx_session становится непомерно огромной, что порой это приводит к замедлению работы сайта из-за долгой выборки сессии из этой таблицы.
Стоит понимать, что сессия создается независимо от того, является ли пользователь авторизованным или нет. Как только на ваш сайт попадает новый пользователь, у вас автоматически появляется новая запись в таблице modx_session. А если он это делает еще и с нескольких устройств, то количество записей будет равно количеству устройств. Правда, это можно исправить, выключив системную настройку anonymous_sessions. Но, если у вас интернет-магазин, то выключать ее нельзя, иначе у неавторизованных пользователей не будет работать, например, корзина.
Учитывая все вышеописанное, такое происходит только потому, что данная таблица не очищается от устаревших сессий.
Как это можно решить?
- Проверить параметр session.gc_probability на сервере, он должен быть больше 0. Если он равен 0, значит механизм очистки от старых сессий не запускается никогда.
- Проверить, насколько часто запускается механизм очистки сессий. Если, к примеру, параметр session.gc_divisor очень большой, то возможно, при вашей посещаемости, очистка от устаревших сессий происходит 1 раз в год или еще реже.
- Проверить время жизни сессий (настройка MODX session_gc_maxlifetime). Если она очень большая, например 1 год, то, очевидно, в течение года сессия будет оставаться живой.
А если, при этом, параметр session_cookie_lifetime значительно меньше этого значения, то на одного пользователя потенциально будет создаваться больше, чем одна сессия, что является излишним. - Если возможности изменить настройку сессий session.gc_probability или session.gc_divisor у вас нет, то есть смысл написать cron-скрипт, о котором я писал выше.
Доходило до такого, что таблица modx_session ввиду отсутствия корректных настроек сессии и обслуживания сайта, разрасталась до нескольких гигабайт
Как можно улучшить стандартный механизм работы с сессиями в MODX
Ко мне пришла в голову идея расширить стандартный класс modSessionHandler, заставив его работать с другой таблицей, которая представляет собой копию modx_session, но где мы можем добавить свои столбцы, например столбец anonymous, столбец user_id и прочие полезные столбцы, по которым мы могли бы делать выборку сессий.
После таких манипуляций, необходимо указать системную настройку session_handler_class, вставив туда название нашего кастомного класса для работы с сессиями (при этом, к сожалению, нет настройки для указания пути к классу, поэтому файл придется класть в системный каталог MODX, туда же, где лежит файл modsessionhandler.class.php).
Какие это может дать преимущества
- При очистке сессий мы можем делать разные условия для времени жизни сессии авторизованных пользователей и анонимных. Например, сессиий анонимных пользователей действительны в течение одних суток, а авторизованных — в течение 7 дней.
- При авторизации одного и того же пользователя с разных устройств, мы могли бы удалять его другую сессию, предотвращая тем самым одновременный вход с разных устройств (если такое предусмотрено логикой вашего сайта).
- При авторизации одного и того же пользователя с разных IP мы могли бы сообщать о подозрительной активности.
- Можно расширить эту таблицу прочими полезными столбцами, которые мы могли бы использовать себе во благо и расширять сайт дополнительным функционалом.
Заключение
Спасибо за внимание! Надеюсь, статья была интересной и вдохновит кого-то из читателей на новые идеи.
Не забывайте подписываться на мой youtube-канал: OpenModx!
Поделитесь с друзьями в социальных сетях
Другие статьи
История моего знакомства с MODx Revolution
#Backend
#Frontend
#MODX
Очереди в Laravel или почему ваш сайт тормозит
#Backend
#Laravel
Актуальные frontend-технологии, которые должен знать каждый разработчик на фрилансе
#Frontend
#Работа в IT
MODx FormIt. Создание форм с произвольной логикой
#Backend
#Frontend
#MODX
Узнавайте первым о новых курсах и лекциях
- Темы
Backend
Frontend
Веб-дизайн
e-Маркетинг
MODX
Laravel
Работа в IT
Vue
Мы используем куки на нашем сайте. Продолжая просмотр, вы соглашаетесь с условиями пользовательского соглашенияСессии в куках, время жизни | PHPClub
BigHarry
Новичок
- #1
Сессии в куках, время жизни
По дефолту кукочные сессии в пхп действуют до закрытия браузера.
Решил продлить это дело, вкатал следующие настройки:
==========================================
session.use_only_cookies on
session.cookie_lifetime 1296000
==========================================
В браузере (Опера) теперь видно, что выданная кука действует 15 дней, но если зайти через какое-то время опять на сайт — то сайт тебя не узнает и подсовывает свежую печенюшку. Что еще надо подправить?
session.gc_maxlifetime будет достаточно, или где-то еще может быть ахтунг?
boombick
boombick.org
- #2
ставь свою куку…
Фанат
oncle terrible
- #3
session. use_only_cookies on
Нажмите для раскрытия…
непонятно, какое эта настрока имеет отношение к времени жизни сессии.
Решил продлить это дело
Нажмите для раскрытия…
Рекомендую получше разобраться со смыслом механизма сессий, и не требовать от них несвойственного.
Если тебе нужны сессии, то тебе не нужно их продление.
Если тебе нужно продление — значит, нужны не сессии, а что-то другое
BigHarry
Новичок
- #4
непонятно, какое эта настрока имеет отношение к времени жизни сессии.
Нажмите для раскрытия…
Да никакого, просто указал, что бы народ не предлагал вместо кук использовать сессии в урлах.
Рекомендую получше разобраться со смыслом механизма сессий, и не требовать от них несвойственного.
Нажмите для раскрытия…
Дело в том, что сайт нам писали девелоперы, которые, похоже, сами мало разбираются для чего нужны сессии, и тупо задействовали этот механизм. Сессии нужны чиста для того, что бы сайт помнил клиента, а точнее — что тот накидал в покупательскую корзинку — И ВСЕ — более никаких авторизаций, паролей и румов для ввода номеров кредиток — ничего такого нету ! Что-то кардинально переделывать — не могу, поэтому и хочу просто продлить время, когда сайт помнит клиента.
tecgnotes
Новичок
- #5
Храните сессии в базе. Указанная вами настройка отвечает лишь за то что про нее написано в мане, те передает пользователю идентификатор только в куки. если вермя куки не то которое ожидается то и сессию он не поймает. Тем более в таком механизме как корзина. Вам потребуется усовершенствовать систему и не надеятся только лишь на сессии и куик, тем более что куки могут быть выключены.
Gorynych
Посетитель PHP-Клуба
- #6
Вам, несомненно, сюда — http://phpfaq.ru/sessions
вкратце, образно ваша ошибка в том, что вы путаете разные вещи:
— кука это это «метка» выдаваемая браузеру. Время жизни куки, это, образно говоря, время в течении которого браузер будет сообщать нужному серверу, что у него есть такая кука.
— сессия это сеанс работы с сервером. Т.е. сеанс запросов и получения ответов от сервера. В рамках сеанса существуют сеансовые переменные. Время жизни сессии на сервере стоит воспринимать, как максимально допустимый интервал между запросами. По истечении этого интервала (т.е. если в течении этого времени запросов к серверу не поступало) сеанс (сессия) считается прерванным, а значения переменных — сброшенными.
— идентификатор сессии — это просто уникальный идентификатор сеанса. Браузер посылает его серверу в виде значения куки или в виде параметров запросов (адресной строки). По нему PHP определяет, какие данные соответсвуют этому сеансу, но если сеанс закончился (истек) данные будут сброшены. Идетифиактор сессии может передаваться через куку или дописываться к адресам ссылок. Механизм работы сессий не зависит от способа передачи идентификатора.
BigHarry
Новичок
- #7
Храните сессии в базе. Указанная вами настройка отвечает лишь за то что про нее написано в мане, те передает пользователю идентификатор только в куки. если вермя куки не то которое ожидается то и сессию он не поймает.
Нажмите для раскрытия…
Что за время куки? Браузер смотрит на время куки и решает — убить ее или передать на сервер.
Типа кука такая: PHPSESSID: 4af37de06ac1e0f7725ff18d0deed9f1
Сервер ловит куку, механизм сессий ищет файл /tmp/mysiteses/ses_4af37de06ac1e0f7725ff18d0deed9f1
Вся фигня в том, что сессионный сборщик мусора, похоже, удаляет раньше времени эти файлы — т. е. кука с номером сессии на клиенте еще жива, а на сервере — файл с этим номером уже отправлен в /dev/nul
Вот я и хочу узнать — session.gc_maxlifetime увеличит жизнь сессионных файлов на сервере или нет.
А хранить в б/д — тормознее будет…
тем более что куки могут быть выключены.
Нажмите для раскрытия…
Плевать. Выключены — значит все, приехали, у клиента корзинка не работает. Я не хочу ничего в движке переделывать, мне за это не платят, я только могу поднастроить апач и пхп.
-~{}~ 15.08.06 17:45:
Автор оригинала: Gorynych
Вам, несомненно, сюда — http://phpfaq.ru/sessionsНажмите для раскрытия…
Спасибо, но я вчерась там уже побывал…
tecgnotes
Новичок
- #8
вот из мана —
????: If different scripts have different values of session. gc_maxlifetime but shares the same place for storing the session data then the script with the minimum value will be cleaning the data. In this case, use this directive together with session.save_path.
Если вы хотите проблит время жизни сесси то надежнее будет session_cache_expire
BigHarry
Новичок
- #9
вот из мана —
????: If different scripts have different values of session.gc_maxlifetime but shares the same place for storing the session data then the script with the minimum value will be cleaning the data. In this case, use this directive together with session.save_path.Нажмите для раскрытия…
Это понятно, у меня сессии используются только на одном сайте, и, соответственно, пересечься с какими-либо другими не могут.
надежнее будет session_cache_expire
Нажмите для раскрытия…
Имхо — этот параметр отвечает совсем за другое — а именно, какой экспир-тайм отдать в заголовке браузеру или прокси, что бы те знали, как долго можно хранить в кэше страницу. Если в сессиях используются только куки — то этот параметр ничего не меняет.
Gorynych
Посетитель PHP-Клуба
- #10
Если в сессиях используются только куки — то этот параметр ничего не меняет.
Нажмите для раскрытия…
это идентификатор сессии передается в виде куки. А рация, по прежнему, на танке
tecgnotes
Новичок
- #11
«Если в сессиях используются только куки — то этот параметр ничего не меняет» — что бы это могло значить?
Экспир тайм по мне эт и есть время действия(жизни сессии) после которого она становится мусором. Даже если соотв куки еще в браузере. Кэш тут только косвенно. сессия с истекшим параметром expire все равно работать не будет и со временем уберется мусорщиком
-~{}~ 15. 08.06 18:22:
Gorynych
именно
Gorynych
Посетитель PHP-Клуба
- #12
http://ru.php.net/manual/ru/ref.session.php
session.use_only_cookies boolean
session.use_only_cookies specifies whether the module will only use cookies to store the session id on the client side. Defaults to 0 (disabled, for backward compatibility). Enabling this setting prevents attacks involved passing session ids in URLs. This setting was added in PHP 4.3.0.
Нажмите для раскрытия…
Фанат
oncle terrible
- #13
BigHarry
короче.
ставь гц макслайфтайм, но гарантии, что оно будет жить две недели, тебе никто не даст.
А хранить в б/д — тормознее будет…
Нажмите для раскрытия…
про тормоза лучше ты сам себе расскажи, когда сборщик мусора будет перелопачивать весь мусор за две недели.
впрочем, тебе-то какая разница. тебе ведь за это не платят
BigHarry
Новичок
- #14
Что бы прекратить всякие домыслы провел ксперимент, как отвечает сервер клиенту с разными настройками.
Первый вариант — session.cookie_lifetime 1296000
PHP:
HTTP/1.0 200 OK Date: Tue, 15 Aug 2006 14:29:20 GMT Server: Apache Vary: Accept-Encoding Set-Cookie: PHPSESSID=3bcb4e9dbcde1cf2427310c3dd9479ef; expires=Wed, 30 Aug 2006 14:29:20 GMT; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Type: text/html Content-Encoding: gzip Content-Length: 2200
Второй вариант — убрал session. cookie_lifetime вааще
PHP:
HTTP/1.0 200 OK Date: Tue, 15 Aug 2006 14:32:50 GMT Server: Apache Vary: Accept-Encoding Set-Cookie: PHPSESSID=d3a3ba54403353477c52156a59ee72bf; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Type: text/html Content-Encoding: gzip Content-Length: 2199
Как видно — исчезло из поля куки указание браузеру, до какого момента хранить куку.
Третий вариант — просто добавил session.cache_expire 1296000
PHP:
HTTP/1.0 200 OK Date: Tue, 15 Aug 2006 14:35:33 GMT Server: Apache Vary: Accept-Encoding Set-Cookie: PHPSESSID=34d2374e264d83942a5663ef5086c326; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Type: text/html Content-Encoding: gzip Content-Length: 2333
Как видим — при добавлении session. cache_expire ничего не меняется, в куке никаких дополнительных директив по ее сроку сохранности не появилось.
В итоге вывод — session.cache_expire не влияет на куку, выдаваеммую сессиями.
Фанат
oncle terrible
- #15
чего только люди не сделают, чтобы документацию не читать…
tecgnotes
Новичок
- #16
Как видно — исчезло из поля куки указание браузеру, до какого момента хранить куку — куда исчезло?оно просто стало дефолтным — у Вас же написано Expires: Thu, 19 Nov 1981 08:52:00 GMT во втором варианте. Потом эта директива должна вызываться до инита сессии. Может после вызывали? Но по-моему мы не о том спорим ваще
Фанат
— согласен
BigHarry
Новичок
- #17
ставь гц макслайфтайм, но гарантии, что оно будет жить две недели, тебе никто не даст.
Нажмите для раскрытия…
Хе, понятно что гарантий нету. Ну если только на файл средствами системы не поставить пермит на запрет удаления.
про тормоза лучше ты сам себе расскажи, когда сборщик мусора будет перелопачивать весь мусор за две недели.
Нажмите для раскрытия…
Я вот подумал — как бы этого сборщика вааще отключить, а старые сессионные файлики грохать по шедулеру через rm… Это реально?
-~{}~ 15.08.06 18:59:
у Вас же написано Expires: Thu, 19 Nov 1981 08:52:00 GMT во втором варианте.
Потом эта директива должна вызываться до инита сессии. Может после вызывали?Нажмите для раскрытия…
Вы путаете — Expires: Thu, 19 Nov 1981 08:52:00 GMT — это не для куки, а для паги дитректива. Она указывает, что страница протухла, и ее кэшировать не надо. Кука тут не причем. Ведь в первом варианте — протухание печенья запланировано на 30 Aug 2006 14:29:20 GMT, а страница — уже протухшая — Thu, 19 Nov 1981 08:52:00 GMT
Инит сессии тут непричем. Каждый раз одна и таже страница со скриптом вызывалась.
Фанат
oncle terrible
- #18
Я вот подумал — как бы этого сборщика вааще отключить, а старые сессионные файлики грохать по шедулеру через rm. .. Это реально?
Нажмите для раскрытия…
реально, нереально… тебе же за написание шедулера деньги не платят?
BigHarry
Новичок
- #19
Фанат
У вас есть конструктив или только пристебы остались?
Фанат
oncle terrible
- #20
не понял.
какие пристёбы?
Конфигурация среды выполнения — Документация по PHP 7.4.3
На поведение этих функций влияют настройки в php.ini .
Имя | По умолчанию | Сменный | Список изменений |
---|---|---|---|
session.save_path | «» | PHP_INI_ALL | |
сеанс.имя | «PHPSESSID» | PHP_INI_ALL | |
session.save_handler | «файлы» | PHP_INI_ALL | |
сеанс.auto_start | «0» | PHP_INI_PERDIR | |
session.gc_probability | «1» | PHP_INI_ALL | |
session. gc_divisor | «100» | PHP_INI_ALL | |
session.gc_maxlifetime | «1440» | PHP_INI_ALL | |
сеанс.serialize_handler | «php» | PHP_INI_ALL | |
session.cookie_lifetime | «0» | PHP_INI_ALL | |
session.cookie_path | «/» | PHP_INI_ALL | |
session.cookie_domain | «» | PHP_INI_ALL | |
session.cookie_secure | «» | PHP_INI_ALL | |
session.cookie_httponly | «» | PHP_INI_ALL | Доступно с версии PHP 5.2.0. |
session.cookie_samesite | «» | PHP_INI_ALL | Доступно с версии PHP 7. 3.0. |
сеанс.use_strict_mode | «0» | PHP_INI_ALL | Доступно с версии PHP 5.5.2. |
session.use_cookies | «1» | PHP_INI_ALL | |
session.use_only_cookies | «1» | PHP_INI_ALL | |
session.referer_check | «» | PHP_INI_ALL | |
session.cache_limiter | «нокэш» | PHP_INI_ALL | |
session.cache_expire | «180» | PHP_INI_ALL | |
session.use_trans_sid | «0» | PHP_INI_ALL | |
session.trans_sid_tags | «a=href,area=href,frame=src,form=» | PHP_INI_ALL | Доступно с версии PHP 7. 1.0. |
сеанс.trans_sid_hosts | $_SERVER[‘HTTP_HOST’] | PHP_INI_ALL | Доступно с версии PHP 7.1.0. |
session.sid_length | «32» | PHP_INI_ALL | Доступно с версии PHP 7.1.0. |
session.sid_bits_per_character | «4» | PHP_INI_ALL | Доступно с версии PHP 7.1.0. |
session.upload_progress.enabled | «1» | PHP_INI_PERDIR | Доступно с версии PHP 5.4.0. |
session.upload_progress.cleanup | «1» | PHP_INI_PERDIR | Доступно с версии PHP 5.4.0. |
session.upload_progress.prefix | «upload_progress_» | PHP_INI_PERDIR | Доступно с версии PHP 5.4.0. |
session.upload_progress. name | «PHP_SESSION_UPLOAD_PROGRESS» | PHP_INI_PERDIR | Доступно с версии PHP 5.4.0. |
session.upload_progress.freq | «1%» | PHP_INI_PERDIR | Доступно с версии PHP 5.4.0. |
session.upload_progress.min_freq | «1» | PHP_INI_PERDIR | Доступно с версии PHP 5.4.0. |
session.lazy_write | «1» | PHP_INI_ALL | Доступно с версии PHP 7.0.0. |
url_rewriter.tags | «a=href,area=href,frame=src,form=» | PHP_INI_ALL | Начиная с PHP 7.1.0, этот INI больше не используется сеансом. |
session.hash_function | «0» | PHP_INI_ALL | Удалено в PHP 7.1.0. |
session.hash_bits_per_character | «4» | PHP_INI_ALL | Удалено в PHP 7. 1.0. |
session.entropy_file | «» | PHP_INI_ALL | Удалено в PHP 7.1.0. |
session.entropy_length | «0» | PHP_INI_ALL | Удалено в PHP 7.1.0 |
session.bug_compat_42 | «1» | PHP_INI_ALL | Удалено в PHP 5.4.0. |
session.bug_compat_warn | «1» | PHP_INI_ALL | Удалено в PHP 5.4.0. |
Для получения более подробной информации и определений Режимы PHP_INI_*, см. Где можно установить параметр конфигурации.
Система управления сессиями поддерживает ряд конфигураций параметры, которые вы можете разместить в файле php.ini . Мы дадим краткий обзор.
-
session.save_handler
нить - session. save_handler определяет имя обработчик, который используется для хранения и извлечения данных связанные с сеансом. По умолчанию файлы . Обратите внимание, что отдельные расширения могут регистрироваться свои собственные save_handler с; зарегистрированные обработчики могут быть полученный на основе каждой установки, ссылаясь на phpinfo(). Смотрите также session_set_save_handler().
-
session.save_path
нить - session.save_path определяет аргумент, который
передается обработчику сохранения. Если вы выберете файлы по умолчанию
обработчик, это путь, по которому создаются файлы. Смотрите также
session_save_path().
В этой директиве есть необязательный аргумент N , который определяет количество уровней каталогов, на которые будут распространяться ваши файлы сеанса около дюйма. Например, установка ‘5;/tmp’ может закончиться созданием файла сеанса и местоположения, например /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If . Чтобы использовать N , вы должны создать все эти каталоги перед использованием. Небольшой сценарий оболочки существует в доб/сеанс , чтобы сделать это, это называется mod_files.sh , с версией для Windows под названием mod_files.bat . Также обратите внимание, что если N используется и больше 0, то автоматическая сборка мусора будет не выполняться, см. копию php.ini для дальнейшего информация. Кроме того, если вы используете N , обязательно окружите session.save_path в «кавычки», потому что разделитель ( ; ) также используется для комментариев в php.ini .
Модуль хранения файлов по умолчанию создает файлы в режиме 600. Это значение по умолчанию можно изменить с помощью дополнительного аргумента MODE : N;MODE;/путь , где MODE — восьмеричный представление режима. Настройка MODE не влияет на umask процесса.
Предупреждение
Если вы оставите этот набор для общедоступного каталога, такого как /tmp (по умолчанию), другие пользователи на сервер может перехватывать сеансы, получая список файлы в этом каталоге.
Осторожно
При использовании дополнительного аргумента уровня каталога N , как описано выше, обратите внимание, что использование значения выше 1 или 2 не подходит для большинства сайтов из-за большого количества каталогов требуется: например, значение 3 подразумевает, что (2 ** session.sid_bits_per_character) ** 3 каталоги существуют в файловой системе, что может привести к большому количеству пространство и иноды.
Используйте N больше 2 только в том случае, если вы абсолютно уверены, что ваш сайт достаточно велик, чтобы потребовать его.
Примечание : До версии PHP 4.3.6 пользователям Windows приходилось изменять эту переменную, чтобы использовать сеансовые функции PHP. Должен быть указан действительный путь, например: c:/temp .
-
сеанс.имя
нить - session.name указывает имя сеанс, который используется в качестве имени файла cookie. Он должен содержать только буквенно-цифровые символы. По умолчанию PHPSESSID . См. также имя_сессии().
-
сессия.auto_start
логический - session.auto_start указывает, модуль сеанса запускает сеанс автоматически по запросу запускать. По умолчанию 0 (отключено).
-
сеанс.serialize_handler
нить - session. serialize_handler определяет имя обработчик, который используется для сериализации/десериализации данных. PHP формат сериализации (имя php_serialize ), PHP внутренние форматы (имя php и php_binary ) и WDDX поддерживаются (имя wddx ). WDDX доступен, только если PHP скомпилировано с помощью WDDX поддерживать. Доступен php_serialize начиная с PHP 5.5.4. php_serialize использует обычный функция сериализации/десериализации внутри и не имеет ограничения, которые php и php_binary есть. Старые обработчики сериализации не может хранить числовой индекс, а строковый индекс не содержит специальных символы ( | и ! ) в $_СЕССИЯ. Используйте php_serialize , чтобы избежать числового ошибки индекса или специального символа при завершении работы скрипта. По умолчанию до PHP .
-
session. gc_probability
целое число - session.gc_probability в сочетании с session.gc_divisor используется для управления вероятностью что процедура gc (сборка мусора) запущена. По умолчанию 1 . Подробнее см. в session.gc_divisor.
-
session.gc_divisor
целое число - session.gc_divisor в сочетании с session.gc_probability определяет вероятность что процесс gc (сборка мусора) запускается при каждом сеансе инициализация. Вероятность рассчитывается с помощью gc_probability/gc_divisor, например 1/100 означает, что вероятность запуска процесса GC составляет 1%. по каждому запросу. session.gc_divisor по умолчанию 100 .
-
session.gc_maxlifetime
целое число - session.gc_maxlifetime указывает номер
секунд, после чего данные будут рассматриваться как «мусор» и
потенциально очищается. Сборка мусора может происходить во время запуска сеанса
(в зависимости от session.gc_probability и
сеанс.gc_divisor).
Примечание : Если разные скрипты имеют разные значения session.gc_maxlifetime , но в одном и том же месте для сохраняя данные сеанса, тогда скрипт с минимальным значением будет очистка данных. В этом случае используйте эту директиву вместе с session.save_path.
-
session.referer_check
нить - session.referer_check содержит подстрока, которую вы хотите проверить для каждого реферера HTTP. Если Referer был отправлен клиентом, а подстрока не была найден, встроенный идентификатор сеанса будет помечен как недействительный. По умолчанию пустая строка.
-
session.entropy_file
нить - session. entropy_file дает путь к
внешний ресурс (файл), который будет использоваться как дополнительный
источник энтропии в процессе создания идентификатора сеанса. Примеры /dev/random или /dev/urandom которые доступны во многих системах Unix.
Эта функция поддерживается в Windows, начиная с PHP 5.3.3. Параметр session.entropy_length в ненулевое значение
заставит PHP использовать Windows Random API в качестве источника энтропии.
Примечание : Удалено в PHP 7.1.0. Начиная с PHP 5.4.0 session.entropy_file по умолчанию на /dev/urandom или /dev/arandom если он доступен. В PHP 5.3.0 эта директива по умолчанию оставлена пустой.
-
session.entropy_length
целое число - session.entropy_length указывает число байтов, которые будут считаны из указанного файла выше. По умолчанию 32 . Удалено в PHP 7.1.0.
-
сеанс.use_strict_mode
логический - session.use_strict_mode указывает,
модуль будет использовать строгий режим идентификатора сеанса. Если этот режим включен,
модуль не принимает неинициализированный идентификатор сеанса. Если не инициализирован
идентификатор сеанса отправляется из браузера, новый идентификатор сеанса отправляется в браузер.
Приложения защищены от фиксации сеанса с помощью принятия сеанса
со строгим режимом.
По умолчанию 0 (отключено).
Примечание : Включение session.use_strict_mode обязательно для общая безопасность сеанса. Всем сайтам рекомендуется включить это. Видеть Пример кода session_create_id() для более подробной информации.
-
session. use_cookies
логический - session.use_cookies указывает, модуль будет использовать файлы cookie для хранения идентификатора сеанса на клиенте. сторона. По умолчанию 1 (включено).
-
session.use_only_cookies
логический - session.use_only_cookies указывает, модуль будет использовать только куки для хранения идентификатора сеанса на стороне клиента. Включение этого параметра предотвращает атаки, связанные с пропуском сеанса. идентификаторы в URL-адресах. По умолчанию 1 (включено), начиная с PHP 5.3.0.
-
session.cookie_lifetime
целое число - session.cookie_lifetime определяет время жизни
файл cookie в секундах, который отправляется в браузер. Значение 0
означает «пока браузер не закрыт». По умолчанию 0 . Смотрите также
session_get_cookie_params() и
session_set_cookie_params().
Примечание : Отметка времени истечения срока действия устанавливается относительно времени сервера, т.е. не обязательно совпадает со временем в браузере клиента.
-
session.cookie_path
нить - session.cookie_path указывает путь для установки в файле cookie сеанса. По умолчанию /. Смотрите также session_get_cookie_params() и session_set_cookie_params().
-
session.cookie_domain
нить - session.cookie_domain указывает домен для установить в файле cookie сеанса. Значение по умолчанию вообще отсутствует, что означает имя хоста сервер, сгенерировавший файл cookie в соответствии со спецификацией файлов cookie. См. также session_get_cookie_params() и session_set_cookie_params().
-
session.cookie_secure
логический - session.cookie_secure указывает, куки-файлы следует отправлять только через безопасные соединения. По умолчанию от . Смотрите также session_get_cookie_params() и session_set_cookie_params().
-
session.cookie_httponly
логический - Помечает файл cookie как доступный только по протоколу HTTP. Это означает что файл cookie не будет доступен для языков сценариев, таких как JavaScript. Этот параметр может эффективно помочь уменьшить кражу личных данных. через XSS-атаки (хотя это поддерживается не всеми браузерами).
-
session.cookie_samesite
нить - Позволяет серверам утверждать, что cookie не следует отправлять вместе с межсайтовые запросы. Это утверждение позволяет пользовательским агентам снизить риск утечки информации из разных источников и обеспечивает некоторую защиту от атаки с подделкой межсайтовых запросов. Обратите внимание, что это поддерживается не всеми браузеры. Пустое значение означает, что атрибут файла cookie SameSite не будет установлен. Lax и Strict означают, что файл cookie не будет отправляться между доменами для запросов POST; Лакс будет отправлять cookie для междоменных запросов GET, а Strict не будет.
-
session.cache_limiter
нить - session.cache_limiter указывает кеш метод управления, используемый для страниц сеанса. Это может быть одно из следующих значений: нокаш , частный , private_no_expire или public . По умолчанию nocache . См. также документация session_cache_limiter() для информацию о том, что означают эти значения.
-
session.cache_expire
целое число - session.cache_expire указывает время жизни для кэшированных страниц сеанса в минутах, это не влияет на ограничитель нокаша. По умолчанию 180 . Смотрите также session_cache_expire().
-
session.use_trans_sid
логический - session.use_trans_sid будь то прозрачный
поддержка sid включена или нет. По умолчанию 0 (отключено).
Примечание : Управление сеансами на основе URL имеет дополнительные риски безопасности по сравнению с управлением сеансом на основе файлов cookie. Пользователи могут отправлять URL-адрес, который содержит идентификатор активного сеанса для своих друзей по электронную почту, или пользователи могут сохранить URL-адрес, содержащий идентификатор сеанса, в их закладки и получить доступ к вашему сайту с тем же идентификатором сеанса всегда, например. Начиная с PHP 7.1.0, полный URL-адрес, например. https://php.net/, это обрабатывается функцией Trans Sid. Предыдущий PHP обрабатывался относительно Только URL-адрес. Целевые хосты перезаписи определяются в session.trans_sid_hosts.
-
session.trans_sid_tags
нить - session.trans_sid_tags указывает, какие теги HTML
переписаны для включения идентификатора сеанса при поддержке прозрачного sid
включен. По умолчанию a=href,area=href,frame=src,input=src,form= форма является специальной биркой. добавляется как переменная формы.
Примечание : До PHP 7.1.0 url_rewriter.tags использовалась для этой цели. Начиная с PHP 7.1.0, набор полей больше не считается специальным тегом.
-
session.trans_sid_hosts
нить - session.trans_sid_hosts указывает, какие хосты переписаны для включения идентификатора сеанса при поддержке прозрачного sid включен. По умолчанию $_SERVER[‘HTTP_HOST’] Можно указать несколько хостов с помощью «,», без пробелов. между хостами. например php.net, wiki.php.net, bugs.php.net
-
session.bug_compat_42
логический - Версии PHP 4.2.3 и ниже имеют недокументированную функцию/ошибку, которая
позволяет инициализировать переменную сеанса в глобальной области видимости,
хотя register_globals
выключен. PHP 4.3.0 и более поздние версии предупредят вас, если эта функция
используется, и если
session.bug_compat_warn также включен. Эта функция/ошибка может быть
отключен путем отключения этой директивы.
Примечание : Удалено в PHP 5.4.0.
-
session.bug_compat_warn
логический - Версии PHP 4.2.3 и ниже имеют недокументированную функцию/ошибку, которая
позволяет инициализировать переменную сеанса в глобальной области видимости,
хотя register_globals
выключен. PHP 4.3.0 и более поздние версии предупредят вас, если эта функция
используется путем включения обоих
session.bug_compat_42
и
session.bug_compat_warn.
Примечание : Удалено в PHP 5.4.0.
-
session.sid_length
целое число - session.sid_length позволяет указать
длина строки идентификатора сеанса. Длина идентификатора сеанса может составлять от 22
до 256.
По умолчанию 32. Если вам нужна совместимость, вы можете указать 32,
40 и т. д. Более длинный идентификатор сеанса сложнее угадать. Не менее 32 символов
рекомендуются.
Наконечник
Примечание о совместимости: используйте 32 вместо session.hash_function = 0 (MD5) и session.hash_bits_per_character = 4, session.hash_function =1 (SHA1) и session.hash_bits_per_character =6. Используйте 26 вместо session.hash_function = 0 (MD5) и session.hash_bits_per_character =5. Используйте 22 вместо session.hash_function = 0 (MD5) и session.hash_bits_per_character =6. Вы должны настроить значения INI так, чтобы в идентификаторе сеанса было не менее 128 бит. Делать не забудьте установить соответствующее значение для session.sid_bits_per_character , иначе вы будет иметь более слабый идентификатор сеанса.
Примечание : Этот параметр представлен в PHP 7.1.0.
-
session.sid_bits_per_character
целое число - session.sid_per_character позволяет указать
количество битов в закодированном символе идентификатора сеанса. Возможные значения
«4» (0–9, a–f), «5» (0–9, a–v) и «6» (0–9, a–z, A–Z, «-», «,»).
Значение по умолчанию — 4. Чем больше битов, тем сильнее идентификатор сеанса. 5 это
рекомендуемое значение для большинства сред.
Примечание : Этот параметр представлен в PHP 7.1.0.
-
session.hash_function
смешанный - session.hash_function позволяет указать хэш
алгоритм, используемый для генерации идентификаторов сеанса. «0» означает MD5 (128 бит) и
«1» означает SHA-1 (160 бит).
Начиная с PHP 5.3.0 также можно указать любой из алгоритмов предоставляется расширением hash (если оно доступны), например, sha512 или водоворот . Полный список поддерживаемых алгоритмов можно можно получить с помощью функции hash_algos().
Примечание : Этот параметр появился в PHP 5. Удален в PHP 7.1.0.
-
session.hash_bits_per_character
целое число - session.hash_bits_per_character позволяет определить
сколько бит сохраняется в каждом символе при преобразовании двоичного
хеш-данные во что-то читаемое. Возможные значения: «4» (0-9, a-f),
«5» (0-9, av) и «6» (0-9, a-z, A-Z, «-«, «,»).
Примечание : Удалено в PHP 7.1.0.
-
session.upload_progress.enabled
логический - Включает отслеживание хода загрузки, заполняя переменную $_SESSION . По умолчанию 1, включено.
-
session.upload_progress.cleanup
логический - Очистите информацию о ходе выполнения, как только все данные POST будут прочитаны.
(т.е. загрузка завершена). По умолчанию 1, включено.
Примечание : Настоятельно рекомендуется оставить эту функцию включенной.
-
session.upload_progress.prefix
нить - Префикс, используемый для ключа выполнения загрузки в $_SESSION . Этот ключ будет объединен со значением $_POST[ini_get(«session.upload_progress. name»)] в предоставить уникальный индекс. По умолчанию «upload_progress_».
-
session.upload_progress.name
нить - Имя ключа, который будет использоваться при хранении $_SESSION информация о прогрессе. Смотрите также session.upload_progress.prefix. Если $_POST[ini_get(«session.upload_progress.name»)] не пройден или недоступен, ход загрузки не будет записан. По умолчанию «PHP_SESSION_UPLOAD_PROGRESS».
-
session.upload_progress.freq
смешанный - Определяет, как часто должна обновляться информация о ходе загрузки. Это может быть определено в байтах (т. е. «обновлять информацию о ходе выполнения после каждых 100 байт») или в процентах (т. е. «обновлять информацию о ходе выполнения после получения каждого 1% от всего размера файла»). По умолчанию «1%».
-
session.upload_progress.min_freq
целое число - Минимальная задержка между обновлениями в секундах. По умолчанию «1» (одна секунда).
-
session.lazy_write
логический - session.lazy_write , если установлено значение 1, означает, что сеанс данные перезаписываются только в случае их изменения. По умолчанию 1, включено.
регистр_глобалы параметры конфигурации влияют на то, как переменные сеанса получают хранится и восстанавливается.
Прогресс загрузки не будет зарегистрирован, если session.upload_progress.enabled включен, и Установлена переменная $_POST[ini_get(«session.upload_progress.name»)]. Подробнее об этой функции см. в разделе Ход загрузки сеанса.
Срок действия веб-сессии не истекает — ℹ️ Поддержка
Dridhas
1
Привет всем,
Добрый день и надеюсь, что вы хорошо себя чувствуете.
просто хочу знать, нормально ли, что веб-сеанс не истекает?
это конфигурация, которую я получил в моем config.php:
‘session_lifetime’ => 60 * 60 * 1,
‘session_keepalive’ => false,
‘remember_login_cookie_lifetime’ => 60 * 60 * 24 * 7,
сейчас я использую Rainloop через веб-браузер, но если я оставлю вкладку открытой более 12 часов, она все равно будет активна.
в идеале я бы хотел, чтобы он автоматически выходил из системы после 8 часов бездействия.
Не могли бы вы посоветовать?
заранее спасибо!
Дридхас
2
У кого-нибудь еще есть эта проблема?
Дридхас
3
это нормально?
анон9582441
4
Сеанс остается активным, если браузер загрузил страницу.
Дридхас
5
Итак, поправьте меня, если я ошибаюсь… если я оставлю вкладку с открытым nextcloud, срок ее действия никогда не истечет?
даже после бездействия?
С уважением!
анон9582441
6
Да, вероятно, поскольку запущен JavaScript для проверки уведомлений и т. д.
Дридхас
7
Итак, зачем нужно истечение срока действия сеанса, если он на самом деле не истекает?
анон9582441
8
Если вы закроете браузер, срок действия сеанса истечет, так что сервер не будет хранить сеансы вечно.
Вы ищете автоматическую блокировку или автоматический выход из системы. Не уверен, что существует.
Фрэнки_Хек
9
У меня была та же проблема, и я до сих пор удивляюсь, что такое поведение безопасности все еще существует в nextcloud 20.0.1! Для меня это утечка безопасности, когда сессия никогда не заканчивается! Чтобы отключить длительный сеанс, вы можете установить эти 3 параметра в своем /config/config.php вот так:
'session_lifetime' => 3600, 'session_keepalive' => ложь, 'remember_login_cookie_lifetime' => 0,
Основной проблемой является время жизни куки (параметр Remember_login_cookie_lifetime ). Я изменил его на ноль. Это гарантирует, что мне нужно снова входить в систему каждый раз, когда я закрываю браузер. Вы можете изменить его значение на такое же, как session_lifetime , чтобы гарантировать, что сессия не умирает при сбоях браузера, но все равно умирает по тайм-ауту сессии.