Вы когда-нибудь задумывались над вопросом: откуда сайт знает о том, что вы авторизованы, или какие товары добавляли ранее в корзину? В этой статье мы подробно рассматривается устройство механизма сессий в Joomla, позволяющее сохранять данные пользователя при его переходе между страницами сайта. Статья будет полезна как веб-мастерам, разрабатывающим сайты, так и владельцам / администраторам сайтов, которые смогут лучше понять принципы работы Joomla.
Зачем нужно сохранять данные при переходе между страницами
Как вы, наверное, поняли из введения, сессии позволяют сохранять данные пользователя при его переходе между страницами сайта. Для начала давайте разберемся с тем, зачем вообще это нужно. Многие скажут, что это лишняя слежка за пользователями и вообще, в этом нет ничего хорошего. На самом деле это не так. Хранить некоторые данные пользователя сайт должен обязательно, иначе он не сможет предоставить пользователю базовый функционал, к которому мы все так привыкли.
Рассмотрим простой пример: авторизация на сайте. Предположим, вы зашли на сайт, ввели логин и пароль, и попали в личный кабинет. Если бы при вводе логина и пароля сайт не сохранил бы ваши данные, то при первом же переходе на другую страницу личного кабинета, вы увидели бы новый запрос на авторизацию.
Думаю, у многих сейчас возникнет вопрос: когда, после авторизации, я перейду на новую страницу, откуда сайт узнает, что я авторизован, и что авторизован именно я? Чтобы ответить на этот вопрос, нужно разобрать два термина «Сессии» и «Cookie»
Что такое Сессии и Cookie
Когда новый пользователь приходит на сайт, то для сайта он обезличен. Условно говоря, сайт ничего не знает о пользователе. Чтобы дать пользователю те или иные права или же показать специфическую информацию (например, товары, добавленные в корзину), сайт должен как-то классифицировать пользователей. Аналогом такой классификации будет наглядный пример из реальной жизни.
Предположим, вы переехали на новое место жительства, и первый раз пришли в больницу. Больнице о вас ничего неизвестно, но при этом она должна как-то работать с вами. Как? При первом посещении в регистратуре просят ваш паспорт и заведут на вас карточку, в которой в дальнейшем, будет храниться вся информация, связанная с вами и больницей. Фактически, карточка – это и есть сессия в Joomla. Но существуют некоторые отличия.
Когда пользователь первый раз заходит на сайт, Joomla ничего не знает о нем, и, в отличие от нашего реального примера, пользователь не предъявляет паспорт. Как же быть? Joomla выдает пользователю справку с неким секретным номером. Под этим же номером в базе данных создается сессия пользователя (запись, в которой хранятся все его данные, аналог больничной карточки). После этого, когда пользователь в следующий раз обратится к сайту, он предъявит свой секретный номер, и сайт по нему найдет у себя карточку со всеми данными пользователя.
Секретный код пользователь хранит у себя в кармане, и носит всегда с собой, чтобы в любой момент иметь возможность обратиться к сайту, и быть идентифицированным. Пиджак, в котором находится этот карман – это браузер, через который вы выходите в Интернет, а сам карман называется Cookie.
Таким образом:
Сессия – это запись на стороне сервера, в которой хранится информация о пользователе.
Cookie – хранилище данных в браузере, в которым данные по каждому сайту хранятся отдельно.
Браузер внимательно относится к безопасности, и покажет секретный код из Cookie только тому сайту, который ему этот код выдал. Таким образом, не получится узнать секретный код, выданный сайтом А, используя сайт Б (есть исключения в виде хакерских атак, но мы не будем рассматривать их в этой статье).
Есть еще один важный аспект, относящийся к хранилищам, это время их жизни. Рассмотрим его подробнее.
Время жизни Сессий и Cookie
Давайте представим, что наш сайт пользуется популярностью, и имеет высокую посещаемость. Как ему работать с сессиями? Возвращаясь к примеру с больницей, представим, что в регистратуру каждый день приходят тысячи новых посетителей и каждому нужно завести отдельную карточку. При этом многие посетители приходят в больницу всего 1-2 раза, а карточки на них остаются, раздувая регистратуру до огромных размеров, не говоря уже про поиск нужной карточки.
Чтобы не происходило такого безобразия, время жизни сессии строго ограничено. Например, это может быть 30 минут, 2 часа или одни сутки. После истечения времени жизни, сессия считается закрытой, и ее данные удаляются с сервера. Если тот же пользователь зайдет на сайт снова уже после закрытия сессии, он будет считаться новым пользователем, и для него будет открыта новая сессия. Думаю, многие из вас замечали, что после авторизации, в случае длительного бездействия на сайте, авторизация сбрасывается. Это происходит как раз из-за того, что сессия закрывается.
С Cookie принцип похожий. Отличие в том, что идентификатор сессии в браузере пользователя имеет срок действия до закрытия браузера. Если же в браузере установлен параметр «Восстанавливать сессии», то срок жизни идентификатора будет неограниченным, а фактически будет равняться сроку жизни сессии на сервере.
Много интересной информации про Cookie вы можете прочитать в статье Куки HTTP на сайте Mozilla. Если вам интересна эта тема, рекомендую статью к обязательному прочтению.
Хранилища сессий в Joomla
Данные сессии на сервере могут храниться в нескольких форматах. Если слишком глубоко не вдаваться в детали, это:
- Файловая система
- База данных
- Оперативная память
По умолчанию Joomla хранит сессии в базе данных. Вы легко можете изменить место хранения сессии (и файлов кэша) в общих настройках Joomla.
Примечание. Не тестируйте переключение хранилищ на рабочем сервере! Зачастую, при смене хранилища вы можете получить ошибку, после которой сайт окажется недоступен. Вернуть прежнее хранилище можно будет только путем правки файла configuration.php.
Какое хранилище лучше / быстрее?
Вообще, конечно, быстрее всего оперативная память. Она будет использоваться, если вы включите обработчик Memcached, Redis или некоторые другие (доступные в общих настройках Joomla обработчики зависят от параметров вашего сервера). Но смена хранилища требует тщательного тестирования, т.к. возможны ошибки или другие неожиданные побочные эффекты. Если посещаемость вашего сайта не слишком велика, и вы не сходите с ума по максимальной оптимизации, используйте стандартное хранилище сессий (базу данных). Как ни крути, они наиболее хорошо оттестировано. Если же у вас выделенный сервер с большим количеством оперативной памяти, и вам кажется, что сайт загружается медленно, то стоит обратить внимание на обработчики, использующие оперативную память.
Параметры сессии в Joomla
Если вы внимательно посмотрите на картинку выше, то увидите, что помимо обработчика сессии, в Joomla есть еще две настройки, относящиеся к этому разделу. Это «Время жизни сессии» и «Общие сессии». Рассмотрим данные опции подробнее.
О том, что такое время жизни сессии, мы уже говорили выше. Каким оно должно быть? Вы скажете: «Чем больше, тем лучше». Это не всегда так. Оптимальное время жизни сессии зависит от многих факторов. Если бы можно было просто сделать его очень большим, так бы и сделали, а не выносили этот параметр в настройки.
Время жизни сессии в Joomla – это время, которое должно пройти после последнего обращения пользователя к сайту, чтобы сессия считалась закрытой. Т.е., если вы задали 30 минут, это не значит, что сессия будет существовать 30 минут, это значит, что она завершится через 30 минут после отсутствия активности пользователя. Давайте разберем этот момент на примере.
Предположим, Вася пришел в интернет-кафе и авторизовался на вашем сайте. Пока Вася взаимодействует с сайтом (переходит по страницам, отправляет формы, комментарии, посты и т.п.), сессия активна. После каждого взаимодействия счетчик времени возвращается на 30 минут. Т.е. Вася может час сидеть на вашем сайте и сессия не закончится. Далее, предположим, что в какой-то момент Вася отвлекся от вашего сайта, и провел 31 минуту в социальных сетях, а затем вернулся к вам. При загрузке новой страницы Вася увидит, что он уже не авторизован на сайте. Joomla попросит его заново ввести логин и пароль.
Таким образом, чем меньше время жизни сессии, тем меньшее время бездействия пользователя необходимо для уничтожения сессии. Если вы сделаете время жизни сессии равным одной минуте, то, вероятно, пользователи будут очень недовольны, т.к. сбросы сессии будут случаться очень часто. Но почему тогда не сделать время жизни сессии большим?
В продолжение истории с Васей рассмотрим такую ситуацию: Вася закончил работать в интернет-кафе и не нажал кнопку «Выход» у вас на сайте, иными словами не разлогинился. После Васи за компьютер сел Петя, который также зашел к вам на сайт (или увидел последний сайт, открытый Васей = ваш). Поскольку Вася не закрыл сессию вручную, Петя может спокойно работать от имени Васи на вашем сайте со всеми вытекающими последствиями. Вы скажете, что вероятность такой ситуации мала. Да, когда время жизни сессии невелико. Но если оно составляет несколько суток, недель, месяцев, то вероятность такого исхода резко повышается.
Другой проблемой длинных сессий является быстрое увеличение размеров хранилища. Представьте: ваш сайт посещает несколько тысяч пользователей ежедневно. При этом вы установили время жизни сессии на несколько месяцев. Каждое посещение сайта новым пользователем будет добавлять в хранилище новую запись, и так до тех пор, пока не истечет время жизни. А учитывая то, что работа с хранилищем сессий ведется при каждом обращении каждого пользователя, большой размер хранилища может серьезно замедлить загрузки страниц сайта и увеличить нагрузку на сервер.
В результате, с настройкой времени жизни сессии мы имеем палку о двух концах: маленькое время – плохо, большое – еще хуже. Учитывая описанное выше, вы можете самостоятельно подобрать и задать время жизни сессии, которое будет лучше всего соответствовать особенностям вашего сайта.
С опцией «Общие сессии» все проще. Ей вы можете задать, общая или раздельная сессия будет для сайта и панели администратора. Если вы хотите, чтобы при авторизации на сайте, сразу же происходила авторизация и в админке, то выбирайте «Да». Если хотите, чтобы авторизации на сайте и в админке были раздельными, выбирайте «Нет». На мой взгляд, раздельные авторизации лучше.
Управление данными сессии в Joomla
В Joomla реализовано легкое управление сессиями. Использовать их может даже человек, который не слишком силен в программировании. Давайте рассмотрим основные команды:
Обязательно пишем, если собираемся работать с сессиями:
1
|
$session = JFactory::getSession();
|
Добавить ваше значение в сессию можно одной строчкой:
1
|
$session->set('myvalue', '123');
|
Получить значение переменной myvalue из сессии можно также одной строчкой:
1
|
$temp= $session->get(' myvalue ');
|
Удалить переменную myvalue из сессии можно… да, опять одной строчкой:
1
|
$session->clear(' myvalue');
|
Собственно, вот и вся работа. Например, если вам нужно решить распространенную задачу, когда при первом входе пользователя на сайт ему показывается приветственное сообщение, а при последующих входах уже нет, вы можете сделать это очень просто:
- В шаблоне/макете Joomla инициализируем работу с сессиями (первая строчка)
- Пытаемся получить значение нашей переменной из сессии (третья строчка)
- Если значение не найдено, значит, пользователь у нас первый раз -> Показываем ему приветствие, и записываем значение нашей переменной в сессию (вторая строчка)
Вот и всё. Теперь, при посещении второй и последующих страниц, скрипт увидит, что в сессии пользователя уже есть переменная отображения приветствия, и не будет показывать его снова до тех пор, пока сессия не завершится.
Надеюсь, данная статья помогла вам лучше понять принцип работы сессий в Joomla.