Суперглобальный массив $_SESSION

PHP :: Сессии

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

(от англ. session ) – это механизм идентификации браузера пользователя и сохранения информации между последовательными доступами к веб-сайту, который позволяет сохранять данные о клиенте на стороне сервера.

Идентификация браузера (и, соответственно, пользователя) осуществляется посредством идентификатора сессии ( session_id ), который представляет собой обычную строковую переменную (по умолчанию ее имя — PHPSESSID ) и присваивается каждому посетителю сайта, позволяя серверу отличить одного пользователя от другого (см. пример №1 ).

'; //Выводим идентификатор сессии echo session_id(); ?>

После того, как при помощи функции session_start() для данного пользователя будет запущена сессия с идентификатором session_id() , на сервере будет создан для нее временный файл, а также станет доступен специальный суперглобальный массив $_SESSION , который как раз и предназначен для хранения переменных текущей сессии пользователя на стороне сервера (в отличие от куки, которые хранятся на стороне пользователя).

Читайте также:  Data preprocessing with python

Следует отметить, что если данные в куки теоретически могут храниться и несколько лет (в зависимости от параметров), то данные в суперглобальном массиве $_SESSION хранятся только до окончания сессии, т.е. до момента закрытия пользователем своего браузера. Точнее, по умолчанию в PHP сессия считается закрытой даже при открытом браузере, если посетитель ушел с сайта и не возвращался в течение 24 минут, т.к. в силу разных технических моментов определить точное время закрытия браузера пользователем невозможно.

После окончания сессии PHP автоматически удаляет ненужные сессионные файлы и, соответственно, все данные связанные с завершенной сессией. Поэтому, если информацию нужно сохранить на более длительное время, ее нужно сохранять отдельно, например, в базе данных или отдельном файле.

Что касается идентификатора сессии, то он хранится либо в cookie на стороне пользователя, либо передается через URL . В первую очередь PHP пытается установить пользователю куки, но также при старте сессии URL дополняется и id сессии на случай, если установка куки в браузере будет невозможна. При следующем запросе, если куки поддерживаются, PHP перестанет дополнять ссылки идентификаторами сессии. Если же прием куки в браузере пользователя будет отключен, то PHP будет постоянно добавлять id сессии к ссылкам, чтобы обеспечить сохранность текущей сессии.

Старт сессии в PHP

Для того, чтобы запустить или возобновить существующую сессию, в PHP присутствует функция session_start() , которую, как и вслучае с отправкой куки, следует вызывать в самом начале php -скрипта до вывода любой другой информации (см. пример №1 ). В случае удачного старта сессии функция возвращает TRUE , если же возникнет ошибка и сессия не стартует, функция вернет FALSE .

Перед стартом сессии, PHP проверяет наличие на компьютере пользователя id возможной недавно запускавшейся (текущей) сессии на другой или этой же странице. Если он находит такой идентификатор и он совпадает со значением, хранящимся на сервере, то считается, что предыдущая (т.е. текущая) сессия еще не закончена, и PHP возобновляет ее. Если же id не найден, то PHP запускает новую сессию и устанавливает для нее id .

id сессии в PHP

Для того, чтобы получить id текущей сессии или назначить ей новый идентификатор, нужно использовать функцию session_id() . При этом, если ни одна сессия не запущена и id явно не установлен, то session_id() вернет пустую строку.

Что касается установки для сессии своего идентификатора, то здесь важно помнить, что задаваемый id может состоять только из символов a-z , A-Z , цифр 0-9 , запятой и знака минус (см. пример №2 ). Кроме того, сама функция session_id() должна быть вызвана до вызова функции session_start() .

Пример №2. Установка id сессии

Также хотелось бы отметить, что если установить один и тот же идентификатор сессии нескольким пользователям, то они смогут посещать страницу по одному и тому же сеансу, т.е. в окружении с одинаковыми параметрами (например, для них будет использоваться время одного и того же часового пояса).

Имя сессии в PHP

Кроме идентификатора сессия имеет еще и собственное имя, которое можно получить или установить при помощи функции session_name() . Если функция вызывается без параметра, то она возвращает имя текущей сессии (по умолчанию это PHPSESSID ). Если аргумент в виде строки с именем, которое нужно установить сессии, присутствует, то функция перезаписывает текущее имя сессии на новое, но возвращает старое (см. пример №3 ).

'; //Выводим id сессии html echo session_id().'
'; //Выводим старое имя сессии до перезаписи echo $old_name; ?>

Пример №3. Установка имени сессии

Важно помнить, что после установки имени сессии, функция session_name() должна вызываться каждый раз перед стартом самой сессии.

Также добавим, что использование собственного имени сессии особенно полезно, если на одном сервере расположены несколько сайтов одного веб-мастера. В этом случае PHP сервера сможет правильно различать сеансы одного и того же пользователя, но к разным сайтам. В результате не будет возникать досадных ошибок с использованием переменных ранее запущенной, но еще не закрытой, на другом сайте сессии.

Суперглобальный массив $_SESSION

Как уже был сказано выше, после старта сессии необходимые данные могут быть занесены в суперглобальный массив $_SESSION и позднее доступны на любой странице сайта, на которой будет запущена сессия (см. пример №4 ). При этом следует помнить, что если после запуска сессии мы создадим свой массив и поместим туда переменные, то они доступны другим страницам не будут.

//------- Первая страница --------      На данной странице мы стартуем сессию и заносим 
данные в суперглобальный массив $_SESSION, которые
далее будут доступны на любой странице сайта, где
будет запущена текущая сессия. Убедимся в этом,
совершив переход на 2-ю страницу здесь и
попробовав вывести данные массива на страницу. //------- Вторая страница -------- Выводим данные массива, помещенные в массив на первой странице: .
Попробуйте закомментировать старт сессии!

Пример №4. Использование суперглобального массива $_SESSION

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

Удаление переменных сессии

Если нужно удалить все переменные связанные с текущей сессией, нужно использовать функцию session_unset() . В результате суперглобальный массив $_SESSION будет очищен (см. пример №5 ). Если же нужно удалить только некоторые данные, то можно использовать функцию unset() (например, unset($_SESSION[‘var_name’]) удалит элемент массива с указанным ключем).

Важно помнить, что применять конструкцию unset($_SESSION) не стоит, иначе будут удалены не только переменные сессии, но и сам суперглобальный массив.

'; //Заносим какие-нибудь данные в массив $_SESSION['my_name']="Иван Иванович"; //Проверяем наличие данных print_r($_SESSION); //Очищаем массив $_SESSION session_unset(); //Пробуем вывести (получим ошибку) echo $_SESSION['my_name']; //Но массив при этом не удаляется (он пустой) print_r($_SESSION); //Сама сессия остается открытой, проверяем это echo '
Сессия работает : '.session_id().'
'; //Заносим заново данные в массив $_SESSION['my_name']="Иван Иванович"; //Проверяем наличие данных print_r($_SESSION); ?>

Пример №5. Удаление переменных сессии

Закрытие сессии в PHP

Чтобы закрыть саму сессию и удалить данные связанные с ней (например, идентификатор сессии), необходимо использовать функцию session_destroy() . После вызова данной функции текущая сессия закрывается, но данные суперглобального массива и установленных куки не удаляются (см. пример №6 ). Поэтому, для очистки массива $_SESSION нужно использовать session_unset() , а для удаления куки — функцию setcookie() .

Пример №6. Завершение сессии

Запустите пример №6 в своем браузере (откройте фрейм в новой вкладке или окне). Затем обновите страницу с примером несколько раз, после чего сделайте тоже самое, но прежде снимите комментирование для строки удаления куки. В результате можно будет увидеть, что если куки не удалять, то при каждом обновлении страницы прежняя сессия будет восстанавливаться (в массив будет заноситься один и тот же session_id ). Если же куки с данными открытой сессии удалять, то при обновлении страницы будет запускаться новая сессия (в массив каждый раз будет заноситься другое значение session_id ).

Подробнее об остальных функциях для работы с сессиями можно узнать в официальном справочнике в разделе «Справочник функций» -> «Расширения для работы с сессиями» -> «Функции для работы с сессиями» .

Быстрый переход к другим страницам

html.okpython.net Copyright © 2016-2023.

Источник

PHP Sessions

A session is a way to store information (in variables) to be used across multiple pages.

Unlike a cookie, the information is not stored on the users computer.

What is a PHP Session?

When you work with an application, you open it, do some changes, and then you close it. This is much like a Session. The computer knows who you are. It knows when you start the application and when you end. But on the internet there is one problem: the web server does not know who you are or what you do, because the HTTP address doesn’t maintain state.

Session variables solve this problem by storing user information to be used across multiple pages (e.g. username, favorite color, etc). By default, session variables last until the user closes the browser.

So; Session variables hold information about one single user, and are available to all pages in one application.

Tip: If you need a permanent storage, you may want to store the data in a database.

Start a PHP Session

A session is started with the session_start() function.

Session variables are set with the PHP global variable: $_SESSION.

Now, let’s create a new page called «demo_session1.php». In this page, we start a new PHP session and set some session variables:

Example

// Set session variables
$_SESSION[«favcolor»] = «green»;
$_SESSION[«favanimal»] = «cat»;
echo «Session variables are set.»;
?>

Note: The session_start() function must be the very first thing in your document. Before any HTML tags.

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 ( session_start() ).

Also notice that all session variable values are stored in the global $_SESSION variable:

Example

// Echo session variables that were set on previous page
echo «Favorite color is » . $_SESSION[«favcolor»] . «.
«;
echo «Favorite animal is » . $_SESSION[«favanimal»] . «.»;
?>

Another way to show all the session variable values for a user session is to run the following code:

Example

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.

Modify a PHP Session Variable

To change a session variable, just overwrite it:

Example

// to change a session variable, just overwrite it
$_SESSION[«favcolor»] = «yellow»;
print_r($_SESSION);
?>

Destroy a PHP Session

To remove all global session variables and destroy the session, use session_unset() and session_destroy() :

Example

// remove all session variables
session_unset();

// destroy the session
session_destroy();
?>

Источник

Оцените статью