Сессии в PHP — часть первая для Чайников

Сессии в PHP работают по простому и исторически известному приципу: данные сессии хранятся на сервере, а идентификатор сессии устанавливается в cookies пользователя.
По умолчанию это выглядит вот так:
- Клиенту устанавливается кука PHPSESSID, значение которой — идентификатор сессии клиента. Обычно это строка примерно такого вида — » cmcjeagp3289oga05a2nw3qga6 «
- На сервере к этому идентификатору привязывается место, в котором хранятся данные именно этого клиента.
Имя куки, которую устанавливает php можно изменить в параметре session.name в php.ini:
или с помощью ini_set:
или с помощью вызова session_name:
Когда на сервер приходит запрос от клиента, то браузер всегда передает все необходимые куки. Таким образом, когда php получает запрос, он «узнает» клиента по куке и теперь данные его сессии доступны внутри глобальной переменной-массива $_SESSION.
В PHP-сессии по умолчанию выключены и для их включения необходимо вызывать session_start(), либо настроить в php.ini автозапуск сессий:
Если session.auto_start выключен, то массив $_SESSION не будет связан с конкретной сессий до вызова session_start(). Поэтому не забывайте запускать session_start() в самом начале работы, до выполнения какой-либо логики.
Каким же образом сессии хранятся на сервере?
За это отвечает настройка session.save_handler и ее уточняющая настройка session.save_path. Если установить на сервер расширение php-memcached будут доступны следующие варианты для session.save_handler:
- «files» — хранить сессии в файлах. В session.save_path заполняется путь к директории, в которой будут хранится сессии
- «memcached» — хранить сессии на сервере memcached. В session.save_path указывается строка подключения к серверу, например: «127.0.0.1:11211«. Подробнее это описано здесь
Собственно, в случае memcached ключ образуется из идентификатора сессии, а в случае работы с файлами, имя файла составляется из идентификатора.
Рабочий пример
Как пользоваться сессиями на простом и рабочем примере:
session_name('my-session-name'); //задаем имя куке до вызова session_start session_start(); //запускаем сессию (указываем session_start явно, чтобы не зависеть от настроек конкретного сервера var_dump($_SESSION); //выводим, что имеется в сессии //создаем счетчик при первом обращении if (empty($_SESSION['count'])) < $_SESSION['count'] = 0; >//считаем кол-во запросов пользователя $_SESSION['count']++;
Если обращаться к этому файлу в браузере, будут вот такие ответы:
Следующий ответ после F5:
Следующий ответ после F5:
Можно посмотреть на имена кук и поиграть с этим руками:
$ curl -i http://127.0.0.1/ HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Fri, 10 Feb 2017 21:12:19 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive Set-Cookie: my-session-name=ft766dgk625rno96c638uqb643; 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 array(0)
Мы видим, что нам дали ответ с заголовком Set-Cookie и установили идентификатор сессии. Первый ответ — пустой массив, как и в случае с браузером. Попробуем отправить второй запрос, передав куку:
$ curl -i --cookie my-session-name=ft766dgk625rno96c638uqb643 http://127.0.0.1/ HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Fri, 10 Feb 2017 21:13:22 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive 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 array(1) < ["count"]=>int(1) >
$ curl -i --cookie my-session-name=ft766dgk625rno96c638uqb643 http://127.0.0.1/ HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Fri, 10 Feb 2017 21:13:32 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive 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 array(1) ["count"]=> int(2) >
Если мы изменим куку, у нас будет другая (в нашем случае новая пустая) сессия:
$ curl -i —cookie my-session-name=blabla http://127.0.0.1/ HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Fri, 10 Feb 2017 21:13:55 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive 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 array(0)
При повторном обращении «левая» сессия будет работать:
$ curl -i --cookie my-session-name=blabla http://127.0.0.1/ HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Fri, 10 Feb 2017 21:14:15 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive 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 array(1) < ["count"]=>int(1) >
Полезная документация
- http://php.net/manual/ru/book.session.php — сессии в php
- http://php.net/manual/ru/memcached.sessions.php — сессис в php хранимые в memcached
- Установка модулей php на debian/ubuntu

Curl в PHP
Curl — это библиотека для работы с URL. Она интегрирована во множество языков, в том числе и в PHP.
Почему timeout для curl в php необходим
Использование cURL в PHP имеет свою не очень приятную особенность — вечная блокировка процесса
Капризы WebSocket и при чём здесь костыли
Протокол WebSocket имеет свои преимущества и свои недостатки: детальный разбор
IoT Highload: особенности и подводные камни
Особенности серверных приложений, работающих с сетью IoT-устройств на практике и в теории
Об архитектуре системы морского навигатора
В проекте морской навигации есть особенность, грамотная реализация которой и позволяет жить всей системе
Session php что это
Сессии являются простым способом хранения информации для отдельных пользователей с уникальным идентификатором сессии. Это может использоваться для сохранения состояния между запросами страниц. Идентификаторы сессий обычно отправляются браузеру через сессионный cookie и используются для получения имеющихся данных сессии. Отсутствие идентификатора сессии или сессионного cookie сообщает PHP о том, что необходимо создать новую сессию и сгенерировать новый идентификатор сессии.
Сессии используют простую технологию. Когда сессия создана, PHP будет либо получать существующую сессию, используя переданный идентификатор (обычно из сессионного cookie) или, если ничего не передавалось, будет создана новая сессия. PHP заполнит суперглобальную переменную $_SESSION сессионной информацией после того, как будет запущена сессия. Когда PHP завершает работу, он автоматически сериализует содержимое суперглобальной переменной $_SESSION и отправит для сохранения, используя сессионный обработчик для записи сессии.
По умолчанию PHP использует внутренний обработчик files для сохранения сессий, который установлен в INI-переменной session.save_handler. Этот обработчик сохраняет данные на сервере в директории, указанной в конфигурационной директиве session.save_path.
Сессии могут запускаться вручную с помощью функции session_start() . Если директива session.auto_start установлена в 1 , сессия автоматически запустится, в начале запроса.
Сессия обычно завершает свою работу, когда PHP заканчивает исполнять скрипт, но может быть завершена и вручную с помощью функции session_write_close() .
Пример #1 Регистрация переменной с помощью $_SESSION .
session_start ();
if (!isset( $_SESSION [ ‘count’ ])) $_SESSION [ ‘count’ ] = 0 ;
> else $_SESSION [ ‘count’ ]++;
>
?>?php
Пример #2 Отмена объявления переменной с помощью $_SESSION .
session_start ();
unset( $_SESSION [ ‘count’ ]);
?>?php
Предостережение
НЕ ОЧИЩАЙТЕ $_SESSION целиком, используя unset($_SESSION) , так как это отключит возможность регистрации сессионных переменных через суперглобальную переменную $_SESSION .
Внимание
Вы не можете использовать ссылки в сессионных переменных, так как не существует реального способа восстановления ссылки к другой переменной.
Замечание:
Сессии, использующие файлы (по умолчанию в PHP), блокируют файл сессии сразу при открытии сессии функцией session_start() или косвенно при указании session.auto_start. После блокировки, ни один другой скрипт не может получить доступ к этому же файлу сессии, пока он не будет закрыт или при завершении скрипта или при вызове функции session_write_close() .
Скорее всего это станет проблемой для сайтов, которые активно используют AJAX и делают несколько одновременных запросов. Простейшим путём решить эту проблему будет вызов функции session_write_close() сразу же как только все требуемые изменения в сессии будут сделаны, предпочтительно ближе к началу работы скрипта. Также можно использовать другой механизм сессии, который поддерживает конкурентный доступ.
User Contributed Notes
There are no user contributed notes for this page.
- Примеры
- Основы использования
- Передача идентификатора сессии
- Пользовательские обработчики сессии
- Copyright © 2001-2023 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Сессии в PHP
Когда мы видим страницу сайта в своем браузере, PHP скрипт этой страницы уже давно отработал и забыл о нас. Поэтому, если мы переходим с одной страницы сайта на другую — PHP скрипт не может запомнить данные с предыдущей страницы, например, значения переменных.
Однако, такой механизм очень нужен, хотя бы для того, чтобы запоминать выбор пользователя или то, что пользователь был авторизован.
В PHP для хранения данных пользователя между страницами сайта предназначены . Мы можем записывать какую-либо информацию в сессию и считывать ее оттуда в следующем запуске этого или другого скрипта сайта. С помощью сессии можно реализовать авторизацию пользователей, корзину интернет-магазина и другое.
Сессия пользователя хранится на сервере. При этом она живет не вечно, а всего около получаса — если пользователь за это время не выполнил никаких обращений к сайту, то его сессия удалится и станет пустой.
Итак, давайте посмотрим, как работать с сессиями на PHP. Чтобы записать что-то в сессию ее сначала нужно с помощью функции session_start :
После инициализации мы можем записать что-нибудь в сессию или прочитать что-нибудь оттуда. Это делается с помощью суперглобального массива $_SESSION .
Давайте попробуем на практике. Сделаем файл test1.php и разместим в нем следующий код:
А в файле test2.php — следующий код:
Теперь для начала откройте в браузере файл test1.php , а потом test2.php . При открытии второго файла в браузере выведется то, что было записано в сессию в первом файле.
Сделайте два файла. При запуске первого файла запишите в сессию два числа, а при запуске второго файла — выведите на экран сумму этих чисел.
Как использовать сессии и переменные сессий в PHP
Обработка сессии это ключевой приём в PHP, что позволяет хранить данные пользователя на всех страницах веб-сайта или приложения. Из этой статьи вы узнаете основы обработки сессии в PHP.
Мы начнем с объяснения того, как работают сессии и как они связаны с куки-файлами. Затем мы рассмотрим несколько фрагментов кода, демонстрирующих, как работать с сеансами. Вы узнаете, как создавать и уничтожать сеансы и как изменять переменные сеанса.
Что такое сессия в PHP?
Сессия — это механизм для сохранения информации на разных веб-страницах для идентификации пользователей пока они бродят по сайту или приложению. Вам интересно, почему сеансы нужны для веб-сайта? Чтобы понять, почему сеансы необходимы, нам нужно чуть вернуться назад и посмотреть, как работает HTTP-протокол.
Протокол HTTP — это протокол без учета состояния, что означает, что сервер не может сопоставить конкретного пользователя по несколькими запросами. Например, при доступе к веб-странице, сервер несёт ответственность за предоставление содержимого запрашиваемой страницы. Поэтому, когда вы обращаетесь к другим страницам одного и того же веб-сайта, веб-сервер интерпретирует каждый запрос отдельно, как если бы они не были связаны друг с другом. Серверу не известно, что каждый запрос исходит от одного и того же пользователя.
Следующая диаграмма вкратце изображает протокол HTTP.

В этой модели, если вы хотите отобразить пользовательскую информацию, вам нужно будет аутентифицировать пользователя в каждом запросе. Представьте, что вам нужно было вводить ваше имя пользователя и пароль на каждой странице с информацией ваших о данных! Да, это было бы громоздко и вообще не практично, и именно здесь на помощь приходят сеансы.
Сессия позволяет вам обмениваться информацией с разными страницами одного сайта или приложения, и помогает поддерживать состояние. Это позволяет серверу знать, что все запросы исходят от одного и того же пользователя, что позволяет сайту отображать информацию и настройки пользователя.
Обработка входа с сессиями и файлами «куки» (cookie)
Давайте быстро рассмотрим общий пример входа на веб-сайт, чтобы понять, что происходит за кулисами.
- Пользователь открывает страницу входа на веб-сайт.
- После отправки формы входа, сервер, на другом конце, аутентифицирует запрос, проверив введённые учётные данные.
- Если учётные данные, введённые пользователем, верны, сервер создаёт новый сеанс. Сервер генерирует уникальное случайное число, которое называется идентификатором сеанса. Также, на сервере, создаётся новый файл, который используется для хранения информации, относящейся к сеансу.
- Затем, идентификатор сеанса передаётся обратно пользователю, вместе с тем, что он запросил. За кулисами этот идентификатор сеанса отправляется в заголовке ответа «куки» PHPSESSID (так называется по умолчанию).
- Когда браузер получает ответ от сервера, он получает заголовок куки-файла PHPSESSID . Если в браузере разрешены «куки», то он сохранит этот PHPSESSID , в котором хранится идентификатор сеанса, переданный сервером.
- Для последующих запросов, «кука» PHPSESSID передаётся обратно на сервер. Когда сервер получает «куку» PHPSESSID , он пытается инициализировать сеанс с этим идентификатором сеанса. Он делает это, загружая файл сеанса, который был создан ранее во время инициализации сеанса. Затем он инициализирует суперглобальную переменную массива $_SESSION с данными, хранящимися в файле сеанса.
Таким образом, пользовательские данные сохраняются даже в нескольких запросах, и пользователь не теряется на протяжении всего сеанса.
На следующей диаграмме показано, как протокол HTTP работает с сеансами.

Теперь, когда вы увидели краткое введение в работу сессий, мы создадим несколько практических примеров, чтобы продемонстрировать, как создавать и манипулировать переменными сессии.
Как запустить сессию
В этом разделе мы обсудим, как запустить сессию в PHP.
Всякий раз, когда вы хотите поработать с переменными сеанса, необходимо убедиться, что сеанс уже запущен. Сеанс в PHP можно запустить несколькими способами.
Использование функции session_start
Метод, в котором сессия запускается функцией session_start , вы будете видеть часто.