Мы принимаем к оплате:
«Подарочный сертификат» от нашего Учебного Центра – это лучший подарок для тех, кто Вам дорог! Оплате обучение и подарите Вашим родным и близким обучение по любому из курсов!!!
«Сертификат на повторное обучение» дает возможность повторно пройти обучение в нашем Учебном Центре со скидкой 1000 рублей!
А также:
Как определить сколько до конца сессии php
PHP — работа с сессиями
Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%
>Здравствуйте, уважаемые читатели блога LifeExample, сегодня хочу затронуть одну несложную тему и в тоже время очень полезную любому PHP проекту. Поговорим о том, как осуществляется работа с сессиями в PHP.
В PHP, работа с сессиями позволяет легко оперировать данными пользователя в период нахождения его на сайте. Это значит, что когда пользователь заходит на ваш сайт, то для него заводится собственное хранилище информации (сессия) на вашем сервере, представляющее собой обычный текстовый файл.
Созданный для пользователя, текстовый файл актуален вплоть до ухода его с сайта, поэтому и называется сессией.
Важно понимать, что файл некоторое время еще хранится на сервере после покидания пользователем сайта, и может быть повторно присвоен этому пользователю, когда он вернется.
Как работать с сессиями PHP
Чтобы создать сессию необходимо в коде формирования страницы, до любого вывода контента, вызвать функцию:
Данная функция создаст новый файл на сервере для хранения данных пользователя и выдаст ему идентификатор session_id, или откроет его актуальную сессию по ранее созданному идентификатору.
Сам идентификатор будет сохранен в куках пользователя в его браузере, обычно в похожем виде:
1 | PHPSESSID: 05eaah3ll02id3ds888vtkfht04 |
После того как мы открыли сессию функцией session_start(), мы получаем возможность оперировать суперглобальным массивом $_SESSION, который является неким адаптером для работы с файлами сессий.
Вообще для того чтобы в PHP работа с сессиями была понятна и проста, лучше временно забыть о существовании файлов на сервере, и помнить только о том, что есть возможность пользоваться массивом $_SESSION, который будет сохранять информацию отведенное время, даже если пользователь переходит на другие страницы сайта или вовсе покидает его.
Пример для работы с сессиями в PHP
session_start(); $fillSession = false; if($fillSession == true){ $_SESSION['age'] = 18; $_SESSION['enter_time'] = time(); $_SESSION['backround_site'] = 'green'; $_SESSION['user'] = array('fio'=> 'fio','email'=>'email','status'=>'VIP'); } print_r($_SESSION); |
В приведенном коде если активен флаг $fillSession, то сессия заполняется определенными данными, заметьте, что типы данных могут быть самыми разнообразными – строки, числа, массивы, значения возвращаемые функциями.
Попробуйте запустить этот код на странице – он не выведет вам ничего. Затем присвойте $fillSession = true и обновите страницу, вы увидите содержание массива $_SESSION.
Теперь верните $fillSession = false, и снова обновите страницу.
Массив наполнился и теперь хранит в себе информацию. Вы даже можете закрыть браузер и снова открыть страницу, как видите — данные сохранились!
Храниться одни будут пока не истечет установленное время сессии или вы лично не уничтожите сессию функцией:
Время жизни сессии в PHP
Время жизни сессии в PHP можно задать несколькими способами:
1. Явно задать количество секунд хранения файлов сессий в коде PHP:
1 | ini_set('session.gc_maxlifetime', 10800); //30 минут |
2. Задать значения для директив в php.ini:
session.gc_maxlifetime = 10800 session.cookie_lifetime = 10800 |
3. Использовать файл .htaccess:
php_value session.gc_maxlifetime 10800 php_value session.cookie_lifetime 10800 |
Для чего можно использовать сессии
В PHP работа с сессиями часто сопровождается задачей – сохранения данных авторизованного на сайте пользователя. Но помимо этого в сессии можно хранить флаги определенных действий, которые совершил или не совершил пользователь, находясь на вашем сайте, например:
- Авторизовался;
- Побывал на конкретной странице;
- Ничего не делал в течение какого-либо периода времени;
- Уже посмотрел всплывающее окно с рекламой;
Также сессия подходит для хранения информации пользователя, например:
- Имя, фамилия, отчество;
- Корзина покупателя;
- Реферальный хост, откуда пришел пользователь;
- Временные данные;
Опасные моменты
Если приложение большое, и обильно используются сессии, то важно следить за тем, чтобы не произошло подобной ситуации:
Поскольку массив $_SESSION доступен для любой вкладки браузера, то пользователь, работая с сайтом в двух вкладках, может подменить необходимую информацию на одной вкладке, а потом продолжить работу в другой, с уже неверными данными, которые могут повлечь разного рода баги.
Перечень всех функций для работы с сессиями
Изучив следующие стандартные методы php, работа с сессиями… будет вам в радость :-). Шучу, на самом деле следующий список приведен только ради полноты информации, но по большому счету кроме session_start(); и session_destroy(); вам редко что-то понадобится.
1234567891011121314151617181920 | session_cache_expire - возвращает окончание действия текущего кэша session_cache_limiter - получает и/или устанавливает текущий ограничитель кэша session_commit - псевдоним session_write_close() session_decode - декодирует данные сессии из строки session_destroy - уничтожает все данные, зарегистрированные для сессии session_encode - шифрует данные текущей сессии как строку session_get_cookie_params - получает параметры куки сессии session_id - получает и/или устанавливает текущий session id session_is_registered - определяет, зарегистрирована ли переменная в сессии session_module_name - получает и/или устанавливает модуль текущей сессии session_name - получает и/или устанавливает имя текущей сессии session_regenerate_id - модифицирует текущий идентификатор сеанса недавно сгенерированным session_register - регистрирует одну или более переменных для текущей сессии session_save_path - получает и/или устанавливает путь сохранения текущей сессии session_set_cookie_params - устанавливает параметры куки сессии session_set_save_handler - устанавливает функции хранения сессии уровня пользователя session_start - инициализирует данные сессии session_unregister - дерегистрирует переменную из текущей сессии session_unset - освобождает все переменные сессии session_write_close - записывает данные сессии и конец сессии |
В данной статье “php работа с сессиями” я попробовал познакомить вас с основами программирования и привел практический пример. Надеюсь вам было понятно. 😉
Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.
Время жизни сессии
Приветствую. Столкнулся с проблемой убийства сессий раньше назначенного им срока. То есть устанавливаю
ini_set('session.gc_maxlifetime', 120960); ini_set('session.cookie_lifetime', 120960);
А сессия убивается примерно через 30 минут. Гуглил долго и тщательно. Не нагуглил ничего, что помогло бы. Стал читать мануал и нашел причину проблемы. Оказалось всё просто до одурения. Сайт хостится на виртуальном хостинге и все сессии хранятся в /tmp. Соответственно скрипты других сайтов чистят все сессии по установленному таймауту, который по умолчанию равен 30 минут. Итак, для того, чтобы избежать такой проблемы надо изменить место хранения сессий — только-то и всего.ini_set('session.save_path', $_SERVER['DOCUMENT_ROOT'] .'../sessions/');
Как вариант можно так. Важно, чтобы к файлам сессий нельзя было получить доступ из вне. Может информация и не нова, но так как я ничего не смог найти в гугле, то решил запостить. Вдруг кому-нибудь пригодится.UPD:
Суть в том, что все сессии имеют параметр — начало. Когда запускается скрипт — php читает настройку времени жизни (и вероятности запуска сборщика мусора) и запускает сборщик мусора. Если сборщик мусора наткнулся на сессию, которая прожила больше, чем указано в настройках — она удаляется. Удаляется файл с сессией, а кука у юзера, естественно, остаётся. Соответственно, если запустится любой скипт с настройкой времени сессии в 30 минут и при этом он будет искать сессии в той же папке, где расмещает их другой скрипт с большим временем — он удалит ВСЕ сессии, даже те, которые должны прожить больше. Именно для этого надо сменить папку. Вот что написано в официально мануале по сессиям:«If different scripts have different values of session.gc_maxlifetime but share 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.»
Теги:- php
- сессии
- время жизни сессий
- виртуальный хостинг
PHP - как определить разбитое время окончания сеанса?
На практике система никогда не может знать конечное время, потому что HTTP в основном является протоколом без состояния. Сессии PHP (и аналогичные функции на других языках веб-скриптов) являются взломом для реализации чего-то, что кажется сдержанным, но такие хаки не могут полностью преодолеть апатридный характер HTTP. Например, как вы обнаружили, нет никакого способа, чтобы сервер знал, что пользователь вышел из системы, если они не прошли процесс выхода из системы.
Вы можете использовать AJAX для вызова пользователя, но, как вы сказали, это использует пропускную способность. Он также не сможет функционировать, если пользователь отключил поддержку JavaScript.
Единственный разумный вариант - регистрировать временную метку для пользователя каждый раз, когда они приземляются на странице в вашей системе и смотрят, сколько времени прошло с момента создания временной метки. Если он превышает разумный предел, скажем, 20 минут, то вы можете сделать предположение, что пользователь больше не находится на вашем сайте. Опять же, это не совсем идеально, поскольку пользователь мог бы просто выпустить дым или что-то в этом роде, но поскольку HTTP является апатридом, никакое решение, которое вы можете реализовать, совершенно идеально.
Как определить, когда сессия закончится. PHP
Я не знаю, возможно ли это. То, что я ищу, - это событие (если оно есть), которое запускается для завершения сеанса. Я хотел бы как-то захватить это и выполнить свое действие прямо до окончания сеанса. Причина этого в том, что мне нужна одна из переменных сеанса, которую я потеряю, как только истечет срок сессии.
Я считаю, что это, вероятно, плохой способ достижения моей цели, если это возможно. Он пятница 19:00 и все еще в офисе. представьте мое возбуждение, пытаясь найти решение.
Спасибо, ребята.
задан Justin Case 11 февр. '12 в 2:16
источник поделиться