Настройка времени сессий в php
Содержание:
- Логика работы сессии
- Servlet1.java
- Работа с сессиями в PHP
- Пример .htaccess
- Небольшой вопросник (FAQ)
- Программная реализация
- Что дальше?
- Пример запуска сессии по нажатию на кнопку
- Подробно о проверке запуска/существования сессии с примерами
- Get PHP Session Variable Values
- Инициализация сессии
- Cookies
- Servlet2.java
- Что такое сессия в PHP?
- Создание переменных сеанса
- Example
Логика работы сессии
Session (или сессия) это некое временное хранилище данных. Сразу предупреждаю, сохранять стоит небольшой объём данных. Например, логин и пароль заходящего пользователя или его порядковый номер в базе данных.
Пример работы1. Пользователь вводит логин и пароль и заходит на сайт2. Данные с логином и паролем сохраняются в сессии одной из страниц сайта:
Файл index.php
session_start(); // каждый файл, в котором Вы хотите использовать данные сессий должен в начале кода содержать команду «запуска сессии»
$login = ‘admin’; $password = ‘pass’; $_SESSION = $login; // сохраняем переменную содержащую логин $_SESSION = $password; // сохраняем переменную содержащую пароль
3. При переходе на другую страницу сайта эти данные также будут доступны:
Файл example.php (или любая другая страница)
session_start(); // снова «запускаем сессиию»
echo «Ваш логин «.$_SESSION; // выведет «Ваш логин admin», хотя на этой странице мы не записывали данных! Видите, все просто!
4. Если хотите очистить данные сессии, то достаточно:
Файл example.php
session_start(); // снова «запускаем сессиию»
unset($_SESSION); // так разрегистрировали переменную или «уничтожили» echo «Ваш логин «.$_SESSION; // выведет «Ваш логин » . Так как мы её уничтожили в прошлой строке, то и данных нет
session_destroy(); // разрушаем сессию. Всех данных, включая $_SESSION уже нет. При их запросе будет выводить ошибка В целом подобная передача похожа на метод POST, но только Вы уже не должны писать много лишнего кода, а все данные, передаваемые от страницы к странице, хранятся во временных файлах на сервере. Повторюсь, сессии должны содержать небольшие объёмы данных, поэтому они подходят под хранение логина/пароля, корзины покупателя и других небольших объёмов.
Servlet1.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Servlet1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response){
try{
response.setContentType("text/html");
PrintWriter pwriter = response.getWriter();
String name = request.getParameter("userName");
String password = request.getParameter("userPassword");
pwriter.print("Welcome "+name);
pwriter.print("Here is your password: "+password);
HttpSession session=request.getSession();
session.setAttribute("usname",name);
session.setAttribute("uspass",password);
pwriter.print("<a href='Welcome'>view details</a>");
pwriter.close();
}catch(Exception exp){
System.out.println(exp);
}
}
Переходя к третьему примеру
Работа с сессиями в PHP
Кукисы, это по сути до 4кб файлик с парами параметр:значение. Вот собственно так и передается наш uid:1 в таком файлике.
* С помощью добавления ссылкам, формам скрытого идентификатора сессии. К формам добавляется скрытый инпут, к ссылкам приписывается идентификатор сессии. Вы могли заметить на некоторых сайтах url в браузере с идентификатором сессии.
4) Как удалить переменную сессии?
— с помощью уже должно быть известной вам ф-ции unset(), к примеру unset($_SESSION); или же ф-цией
5) Сколько времени длится сессия?
— По-умолчанию до того времени как вы закрыли браузер или бездействуете на сайте(не ходите по страничкам) 24минуты(или другой, заданный в настройках сервера)
6) Как увеличить время жизни сессии средствами php?
— Собственно думаю нижеприведенный код достаточно элементарный:
$sessionCookieExpireTime=8*60*60; // 8 часов = 8 * 60 * 60 session_set_cookie_params($sessionCookieExpireTime); session_start();
7) Как закрыть/закончить сессию?
— ф-ция
Ну собственно вроде кратко, но основное.
Пример .htaccess
Настройки вашего сервера могут отличаться, это просто пример
# Use php_flag for boolean values,
# php_flag session.auto_start off
php_flag session.use_cookies on
php_flag session.use_only_cookies on
php_flag session.use_trans_sid off
php_flag session.use_strict_mode on
# Use php_value for non-boolean values
# Enclose values that contain punctuation in quotes.
php_value session.cache_limiter nocache
php_value session.cookie_samesite Lax
php_value session.name AOSESSID
php_value session.save_path ./tmp
# Cookie settings
php_value session.cookie_path ‘/’
php_value session.cookie_lifetime 0
php_flag session.cookie_httponly on
php_flag session.cookie_secure on
Небольшой вопросник (FAQ)
Где физически хранятся данные сессий?
Данные сессий хранятся на сервере. По умолчанию они записываются в файлы, но можно задать свой собственный механизм хранения данных сессий (например с использованием базы данных). Если хотите подробностей, смотрите функцию session_set_save_handler.
Можно ли написать собственный механизм сессий?
Да, это вполне возможно. Как видите, PHP не использует ничего сверхъестественного — идентификатор сохраняется между запросами с помощью кук, данные сессий хранятся в файлах на сервере.
Например, собственный механизм работы с сессиями есть в популярном фреймворке CodeIgniter.
Насколько безопасен механизм сессий?
Сессия идентифицируется только с помощью уникального идентификатора сессии, поэтому в общем случае злоумышленнику достаточно украсть его, чтобы запутать сервер. Возьмём тестовый скрипт, который мы использовали выше. Если обращение к нему будет с другого IP (по отношению к создавшему сессию), но PHPSESSID будет передаваться тот же самый, то сессия будет успешно восстановлена и счётчик будет увеличиваться с предыдущего сохранённого значения.
Обеспечивать дополнительную защиту придётся вам самим. Например:
- Можно сохранять в данных сессии IP и User-Agent клиента (будет храниться на стороне сервера), а затем при каждом обращении проверять, что актуальные значения совпадают с сохранёнными. В данном случае приходится искать компромисс между безопасностью и удобством работы пользователя.К примеру, если у пользователя динамический IP и вы используете сессии для поддержания авторизации, но при этом проверяете совпадение IP, то при каждой смене адреса пользователю придётся заново вводить логин и пароль.Точно также строка User-Agent может меняться при обновлении версии браузера или при установке некоторых плагинов.
- Одним из рекомендуемых механизмов защиты сессий является повторная генерация идентификатора при каждом обращении к скрипту (см. функцию session_regenerate_id). Посмотреть скрипт и алгоритм работы в разрезе можно ниже.Примечание. Если верить , то при повторной генерации идентификатора могут возникнуть проблемы с параллельным доступом к данным.
Программная реализация
Сеансы TCP обычно реализуются в программном обеспечении с использованием дочерних процессов и / или многопоточности , где новый процесс или поток создается, когда компьютер устанавливает сеанс или присоединяется к нему. Сеансы HTTP обычно реализуются не с использованием одного потока на сеанс, а с помощью базы данных с информацией о состоянии каждого сеанса. Преимущество нескольких процессов или потоков заключается в упрощенной сложности программного обеспечения, поскольку каждый поток является экземпляром со своей собственной историей и инкапсулированными переменными. Недостатком являются большие накладные расходы с точки зрения системных ресурсов и то, что сеанс может быть прерван при перезапуске системы.
Когда клиент может подключиться к любому серверу в кластере серверов, возникает особая проблема в поддержании согласованности, когда серверы должны поддерживать состояние сеанса. Клиент должен быть либо направлен на один и тот же сервер на время сеанса, либо серверы должны передавать информацию о сеансе на стороне сервера через общую файловую систему или базу данных. В противном случае клиент может повторно подключиться к другому серверу, чем тот, с которого он начал сеанс, что вызовет проблемы, когда новый сервер не будет иметь доступа к сохраненному состоянию старого.
Что дальше?
Последующие загрузки страницы до закрытия браузера будут работать по аналогии с тем, как работала вторая загрузка скрипта.
Т.к. время жизни куки было ограничено текущей сессией браузера, то после его закрытия уникальный идентификатор сессии будет утерян и при перезапуске процесс пойдёт по новой.
Тем не менее можно вернуться к сохранённой сессии, если явно указать PHPSESSID в качестве параметра скрипта:
Возвращение к сессии довольно условное, т.к. в результате работы скрипта в данном случае кука не создаётся. Заголовки ответа сервера:
HTTP/1.1 200 OK
Date: Thu, 29 Sep 2011 21:01:52 GMT
Server: Apache/2.2.13 (Win32) PHP/5.2.10
X-Powered-By: PHP/5.2.10
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-Length: 58
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
Т.е. для поддержания работы именно с этой сессией ко всем ссылкам придётся приписывать ?PHPSESSID=k33en6ccgcia7125mitj5te4u6.
Примечание. Можно указать PHP, чтобы уникальный идентификатор сессии передавался только через куку. Для этого нужно установить session.use_only_cookies в значение 1. В этом случае трюк, продемонстрированный выше, не пройдёт.
Если куки в браузере отключены, то можно передавать идентификатор сессии через параметры, как мы делали выше. Причём в PHP есть механизм, который будет сам дописывать нужный параметр в ссылки и добавлять скрытые поля в формы. Принцип работы точно такой же, как и с куками, поэтому не будем разбирать этот случай отдельно.
Пример запуска сессии по нажатию на кнопку
Скачать запуск сессии по клику в
запуска сессии по кнопке
Нам понадобится несколько элементов формы, не буду останавливаться подробно на механизмах отправки -> см.post. Соберем самую простую, чтобы мы могли увидеть запуск сессии по нажатию кнопки:
<form action=»» method=»post»>
<input type=»submit» name=»submit» value=»создать сессию»>
</form>
Нам потребуется скрипт, который примет наш отправленный пост запрос и запустит сессию под именем PRIMER, ниже приведенный код будет размещен на данной странице:
<?
session_start();
if($_POST) { $_SESSION = ‘здесь какие-то данные’;}
?>
Далее нам потребуется механизм проверки существования сессии PRIMER, создаем условие if, если сессия с этим именем существует, то выводим информацию, что сессия запущена. Если нет, то выводим, что сессия не запущена (см. ):
<?
if($_SESSION)
{
//сессия запущена
}
else
{
//сессия не запущена
}
?>
И далее нам потребуется кнопка, код которой был выше, по нажатию на которую отправится пост запрос и запустится сессия!
Надеюсь, что сессия благополучно была создана! Теперь, у нас остались не освещенным тема разрушение сессии вообще и тоьок определенно! Начнем с определенной, которую только создали!
Подробно о проверке запуска/существования сессии с примерами
- -> сессия не запущена
- -> сессия запущена
-
Создадим живой пример проверки существования сессии — будем использовать выше приведенный пример.
Добавим кнопку, по нажатию на которую…
Если сессия существует — удалим сессию, + перезагрузимся, чтобы скрипт сработал сначала и вывел, сто сессия не существует.
Иначе(т.е. сессия не существует) — создай сессию по нажатию на кнопку + перезагрузимся, после этого скрипт снова должен сработать и выдать результат, что сессия создана!
Ячейка сессии $_SESSION не существует
Логика скрипта и необходимые условия:
В одной части проверяем существует ли ячейка сессии, в ней выполняем все соответствующие действия.
if($_SESSION)
{
$echo2 ='<greenblock>Ячейка сессии $_SESSION существует и равна: <span style=»color:black;»>’.$_SESSION.'</span></greenblock>’;
$button = ‘Удали сессию, которую создал!’;
if($_POST)
{
unset($_SESSION);
echo'<meta http-equiv=»Refresh» content=»0; URL=»>’;
}
}
Иначе выполняем противоположные действия:
else
{
$echo2 ='<redblock>Ячейка сессии $_SESSION не существует</redblock>’;
$button = ‘Создай сессию, которая не существует!’;
if($_POST)
{
$_SESSION = ‘значение_ячейки_сессии’;
echo'<meta http-equiv=»Refresh» content=»0; URL=»>’;
}
}
Добавляем form
+ post
+ button
+ submit
Скачать скрипт проверки существования сессии php!
Для данного параграфа у нас есть:
Скачать пример с не запущенной сессией в
Для данного параграфа — мы создали специальную страницу(см.выше пример), где изначально сессия не запущена!
И теперь разберемся, как данный код работает!
Нам потребовался простой каркас html страницы
На странице разместили вот такое условие():
<? if ($_SESSION) { echo ‘Сессия уже запущена ранее…’; } else { echo ‘Сессия не существует…’; } ?></red>
Скачать пример с не запущенной сессией в
<!DOCTYPE html><head><html lang=»ru»><meta charset=»UTF-8″><title>Пример скрипта Проверить запущена ли сессия php</title>
<link rel=»stylesheet» type=»text/css» href=»https://dwweb.ru/__a-data/__all_for_scripts/__examples/__examples.css»>
</head>
<body>
<blockCenter>
<h2>Вывод проверки запущена сессия php или нет!? </h2>
Да… совсем забыл сказать, что сессия не запущена
<l>Результат</l>
<div class=»kod»>
<red><? if ($_SESSION) { echo ‘Сессия уже запущена ранее…’; } else { echo ‘Сессия не существует…’; } ?></red>
</div>
</blockCenter>
</body>
</html>
Get PHP Session Variable Values
Next, we create another page called «demo_session2.php». From this page, we
will access the session information we set on the first page («demo_session1.php»).
Notice that session variables are not passed individually to each new page,
instead they are retrieved from the session we open at the beginning of each
page ().
Also notice that all session variable values are stored in the global $_SESSION variable:
Example
<?phpsession_start();?><!DOCTYPE html><html>
<body><?php// Echo session variables that were set on previous pageecho «Favorite color is » . $_SESSION . «.<br>»;echo «Favorite animal is » . $_SESSION . «.»;?>
</body></html>
Another way to show all the session variable values for a user session is to run the
following code:
Example
<?phpsession_start();?><!DOCTYPE html><html><body><?php
print_r($_SESSION);?></body></html>
How does it work? How does it know it’s me?Most sessions set a user-key on
the user’s computer that
looks something like this: 765487cf34ert8dede5a562e4f3a7e12. Then, when a
session is opened on another page, it scans the computer for a user-key. If
there is a match, it accesses that session, if not, it starts a new session.
Инициализация сессии
Сессия начинается с помощью функции
Эта функция должна быть включена во все скрипты, в которых вам нужно использовать сессии.
Сперва выполняет проверку наличия активной сессии. Если сессии нет — начинает новую.
Сохраняет данные в супер глобальной переменной
$_SESSION,
которая является
массивом
Если последняя строка вам непонятна — прочитайте статью
«Тернарный оператор в PHP»
Демонстрацию работы session_start() в вашем браузере вы можете сделать на
этой странице
Посмотреть куки можно в Chrome DevTools → Application → Cookies
Выберите andreyolegovich.ru или urn.su и найдите AOSESSID
Изучить файл с данными о сессии можно в директории, которую вы указали в
php_value session.save_path
В моём
указан
Поэтому я смотрю содержимое там
cat ./tmp/sess_d510566d6fc7dcbf9a9c21eb29d846ce
username|s:6:»Andrei»;
Cookies
Cookies (в дальнейшем просто «куки») — небольшие фрагменты данных, которые веб-сервер отправляет браузеру.
Браузер сохраняет их у себя, а при следующем посещении веб-страницы отправляет обратно. Благодаря этому, веб-сервер сможет узнать своего «старого» посетителя, идентифицировать его.
С технической стороны, куки — это обычные HTTP заголовки.
Когда веб-сервер хочет записать куку в браузер пользователя, он отсылает специальный заголовок ответа с названием . В этом заголовке должна содержаться необходимая информация и дополнительные аттрибуты, о которых пойдёт речь далее.
В следующий раз, когда браузер пользователя запросит веб-страницу с того же сайта, в числе прочих заголовков он передаст заголовок запроса . Веб-сервер получит эту информацию, и она будет доступна также и для PHP.
Являясь серверным языком программирования, PHP может управлять заголовками, которые отправляет сервер, а значит может устанавливать и читать куки.
Чтобы добавить новую куку, необходимо вначале определиться со следующими критериями:
- Название этой куки (может состоять только из символов латинского алфавита и цифр);
- Значение, которое предполагается хранить;
- Срок жизни куки — это обязательное условие.
За установку куки в PHP отвечает функция , ей нужно передать как минимум три параметра, описанных выше. Пример:
Обратите внимание, что срок жизни указывается в относительной величине. В этом примере кука будет существовать ровно 30 дней с момента установки
Как прочитать куки
В PHP максимально упрощён процесс чтения информации из кукисов. Все переданные сервером куки становятся автоматически доступны в специальном глобальном массиве
Так, чтобы получить содержимое куки с именем «visit_count», достаточно обратиться к одноимённому элементу массива , например вот так:
Обратите внимание: установив в сценарии куку через , прочитать её можно будет только при следующем посещении страницы
Собираем всё вместе
Теперь, научившись устанавливать и читать куки, напишем полноценный сценарий, который будет считать и выводить количество посещений страницы пользователем:
Servlet2.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Servlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response){
try{
response.setContentType("text/html");
PrintWriter pwriter = response.getWriter();
HttpSession session=request.getSession(false);
String myName=(String)session.getAttribute("usname");
String myPass=(String)session.getAttribute("uspass");
pwriter.print("Name: "+myName+" Pass: "+myPass);
pwriter.close();
}catch(Exception exp){
System.out.println(exp);
}
}
}
четвертый пример
Что такое сессия в PHP?
Известно, что веб-сервер не поддерживает постоянного соединения с посетителем, и каждый запрос обрабатывается, как новый, без связи с предыдущими. А это означает, что сервер не может запоминать конкретного посетителя между несколькими запросами, т.е. при доступе к веб-странице сервер отвечает за предоставление содержимого только конкретной запрашиваемой страницы.
Часто возникает необходимость отображать информацию определенного пользователя на всех страницах и, при этом, вам нужно аутентифицировать пользователя в каждом запросе. Представьте, что вам нужно было бы вводить логин и пароль пользователя на каждой странице, где была представлена ваша информация о профиле. Это было бы вообще не практично, и именно в таких случаях необходимы сессии.
Переменные сессии решают эту проблему, сохраняя информацию о пользователе, которая будет использоваться на нескольких веб-страницах (например, логин посетителя, любимая музыка и др.). По умолчанию переменные сессии действуют до тех пор, пока пользователь не закроет браузер.
Одним из недостатков файлов является то, что они хранятся на компьютере пользователя. Это дает пользователю возможность получать доступ, просматривать и изменять этот файл cookie, что может привести к сбою приложения. PHP, наоборот, хранят в системе пользователя только идентификационный файл cookie, который используется для ссылки на файл сессии на сервере. Таким образом, пользователь не имеет доступа к содержимому файла сессии, тем самым обеспечивая безопасную альтернативу файлам cookie. Сессии PHP также работают, когда пользователь отключает поддержку файлов cookie браузером.
Сеанс создает файл во временном каталоге на сервере, где хранятся зарегистрированные переменные сеанса и их значения. Эти данные будут доступны для всех страниц сайта во время этого посещения.
Сессия создает файл во временном каталоге на сервере, где хранятся зарегистрированные переменные сессии и их значения. Эти данные будут доступны для всех страниц сайта во время этого посещения пользователем.
Расположение временного файла определяется настройкой в файле php.ini в директиве .
Пример использования в файле php.ini:
session.save_path = «/var/www/my_site/data/tmp»
Изменить директорию для хранения файлов сессий можно добавив в файл .htaccess:
php_value session.save_path «/var/www/my_site/data/tmp»
Перед использованием любой переменной сеанса убедитесь, что вы установили этот путь.
Когда сессия стартует, происходит следующее:
-
Сначала PHP создает уникальный идентификатор для этой конкретной сессии, который представляет собой случайную строку из 32 шестнадцатеричных чисел, например 5c9foj24c3jj973hjkop2fc937e3463.
-
Файл cookie под названием автоматически отправляется на компьютер пользователя для хранения уникальной строки идентификации сессии.
-
Файл автоматически создается на сервере в назначенном временном каталоге и имеет имя уникального идентификатора с префиксом sess_, т.е. sess_5c9foj24c3jj973hjkop2fc937e3463.
Когда сценарию PHP нужно получить значение из переменной сессии, PHP автоматически получает строку уникального идентификатора сессии из файла cookie , а затем ищет в своем временном каталоге файл c этим именем и проверка может быть выполнена путем сравнения обоих значений.
С помощью специальных функций мы можем получить данный идентификатор:
echo session_id(); // идентификатор сессии
echo session_name(); // имя — PHPSESSID
То же значение мы могли бы получить, обратившись к cookie напрямую:
echo $_COOKIE;
Сессия заканчивается, когда пользователь закрывает браузер или покидает сайт, сервер завершает сеанс через заранее определенный период времени, обычно продолжительностью 30 минут.
Создание переменных сеанса
В этом разделе мы изучим, как инициализировать переменные сессии в PHP.
Как мы уже обсудили, при запуске сеанса, инициализируется суперглобальный массив с соответствующей информацией о сессии. По умолчанию, он инициализируется в виде пустого массива, и вы можете хранить больше информации, используя пару ключ–значение.
Давайте рассмотрим следующий пример кода, который показывает, как инициализировать переменные сеанса.
Как видите, мы запустили сессию в начале скрипта, используя функцию . После этого мы инициализировали несколько переменных сессии. Наконец, мы использовали эти переменные через суперглобальную переменную .
При хранении данных сеанса с помощью , в итоге, они хранятся в соответствующем файле сессии на сервере, который был создан, когда сессия была запущена. Таким образом данные сеанса совместно используются несколькими запросами.
Как мы уже рассмотрели, информация о сессии передаётся вместе запросами, таким образом переменные сессии, инициализированные на одной странице, могут быть доступны на других страницах, а также, до окончания сессии. Как правило сессии истекают, при закрытии браузера.
Example
A simple example using to store page views for a user.
var express = require('express')
var parseurl = require('parseurl')
var session = require('express-session')
var app = express()
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true
}))
app.use(function (req, res, next) {
if (!req.session.views) {
req.session.views = {}
}
// get the url pathname
var pathname = parseurl(req).pathname
// count the views
req.session.viewspathname = (req.session.viewspathname || ) + 1
next()
})
app.get('/foo', function (req, res, next) {
res.send('you viewed this page ' + req.session.views'/foo' + ' times')
})
app.get('/bar', function (req, res, next) {
res.send('you viewed this page ' + req.session.views'/bar' + ' times')
})