Сессии в 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-устройств на практике и в теории
Об архитектуре системы морского навигатора
В проекте морской навигации есть особенность, грамотная реализация которой и позволяет жить всей системе
Введение
Поддержка сессий в PHP заключается в способе сохранения некоторых данных между несколькими последовательными доступами.
Каждому посетителю сайта присваивается уникальный идентификатор, называемый идентификатором сессии (session id). Он хранится либо в cookie на стороне пользователя, либо передаётся через URL.
Поддержка сессий позволяет сохранять данные между запросами в суперглобальном массиве $_SESSION . В тот момент, когда посетитель получает доступ к сайту, PHP проверяет автоматически (если session.auto_start установлено в 1) или по запросу (явным образом через вызов session_start() ), был ли определённый идентификатор сессии послан вместе с запросом. Если это так, восстанавливается сохранённое ранее окружение.
Предостережение
При включённом session.auto_start единственным способом помещения объектов в сессию останется загрузка описаний класса с помощью auto_prepend_file. В противном случае придётся выполнить сериализацию ( serialize() ) и десериализацию ( unserialize() ) объекта вручную.
$_SESSION (и все зарегистрированные переменные) сериализуются внутри PHP после выполнения запроса, используя обработчик сериализации, указанный в INI-опции session.serialize_handler. Зарегистрированные, но неопределённые переменные помечаются как неопределённые. При последующем доступе они не определяются сессионным модулем, если пользователь заново не определит их.
Внимание
Так как сессионные данные сериализуются, то переменные с типом resource не могут храниться в сессиях.
Обработчики сериализации ( php и php_binary ) наследуют ограничения для register_globals. Поэтому нельзя использовать числовые или строковые индексы содержащие специальные символы ( | и ! ). Их использование приведёт к ошибкам по завершении скрипта. У php_serialize такие ограничения отсутствуют.
Замечание:
При работе с сессиями обратите внимание, что запись в сессии не создаётся до тех пор, пока переменная не будет зарегистрирована в суперглобальном массиве $_SESSION . Это правило действует вне зависимости от того, была ли сессия запущена с использованием функции session_start() .
User Contributed Notes
There are no user contributed notes for this page.
- Сессии
- Введение
- Установка и настройка
- Предопределённые константы
- Примеры
- Отслеживание прогресса загрузки файлов с помощью сессий
- Безопасность сессий
- Функции для работы с сессиями
- SessionHandler
- SessionHandlerInterface
- SessionIdInterface
- SessionUpdateTimestampHandlerInterface
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Где хранятся сессии php
Сессии представляют набор переменных, которые хранятся на сервере (либо часть на сервере, а часть — в cookie браузера) и которые относятся только к текущему пользователю. В какой-то степени сессии являются альтернативой кукам в плане сохранения данных о пользователе.
Для запуска сессии необходимо вызвать функцию session_start() . Она должна вызываться до отправки ответа пользователю:
При запуске сессии с помощью функции session_start() , если пользователь первый раз заходит на сайт, PHP назначает ему уникальный идентификатор сессии. Этот идентификатор с помощью cookie, которые по умолчанию называются «PHPSESSID», сохраняется в браузере пользователя. С помощью этого идентификатора пользователь ассоциируется с данными сессии. Если для пользователя уже установлена сессия, то данная функция продлевает текущую сессию вместо установки новой.
С помощью специальных функций мы можем получить идентификатор сессии:
session_start(); echo session_id(); // идентификатор сессии echo session_name(); // имя - PHPSESSID
То же значение мы могли бы получить, обратившись к cookie напрямую:
echo $_COOKIE["PHPSESSID"];
Затем для сохранения или получения данных в сессии надо использовать глобальный ассоциативный массив $_SESSION . Сохранение переменной в сессии:
$_SESSION["имя_переменной"] = значение;
Получение сохраненного значения:
$переменная = $_SESSION["имя_переменной"];
Сохранение данных в сессии
Запустим сессию и сохраним в ней значения:
После установки сессии в браузере мы сможем заметить установку специальной куки, которая по умолчанию называется «PHPSESSID»:

SESSION» />SESSION» />
Получение данных сессии
Теперь получим эти значения и выведем на страницу:
session_start(); if (isset($_SESSION["name"]) && isset($_SESSION["age"])) < $name = $_SESSION["name"]; $age = $_SESSION["age"]; echo "Name: $name
Age: $age"; >Удаление данных сессии
Сессия уничтожается с закрытием браузера, однако мы также можем программно удалить либо какие-то отдельные, либо все данные сессии.
Для удаления одной переменной из сессии применяется функция unset() :
session_start(); unset($_SESSION["age"]); // удаляем из сессии переменную "age"
Удалить все данные сессии можно с помощью функции session_destroy() :
session_start(); session_destroy();
Где хранятся сессии 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-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy