Удаление сессий в PHP
Иногда нам может понадобится удалить какую нибудь переменную сессии, не затрагивая остальных. Это делается с помощью функции unset :
После выполнения такого кода наша переменная станет null :
Вот код счетчика из предыдущего урока:
Модифицируйте этот код так, чтобы при достижении счетчиком значения 10 , отсчет начинался сначала.
Завершение всей сессии
Если же вам нужно удалить все переменные сессии для данного пользователя, то следует воспользоваться функцией session_destroy :
Учтите, что эту функцию можно вызывать только тогда, когда сессия запущена через session_start .
Как очистить session php
Сессии представляют набор переменных, которые хранятся на сервере (либо часть на сервере, а часть — в cookie браузера) и которые относятся только к текущему пользователю. В какой-то степени сессии являются альтернативой кукам в плане сохранения данных о пользователе.
Для запуска сессии необходимо вызвать функцию session_start() . Она должна вызываться до отправки ответа пользователю:
При запуске сессии с помощью функции session_start() , если пользователь первый раз заходит на сайт, PHP назначает ему уникальный идентификатор сессии. Этот идентификатор с помощью cookie, которые по умолчанию называются «PHPSESSID», сохраняется в браузере пользователя. С помощью этого идентификатора пользователь ассоциируется с данными сессии. Если для пользователя уже установлена сессия, то данная функция продлевает текущую сессию вместо установки новой.
С помощью специальных функций мы можем получить идентификатор сессии:
То же значение мы могли бы получить, обратившись к cookie напрямую:
Затем для сохранения или получения данных в сессии надо использовать глобальный ассоциативный массив $_SESSION . Сохранение переменной в сессии:
Получение сохраненного значения:
Сохранение данных в сессии
Запустим сессию и сохраним в ней значения:
После установки сессии в браузере мы сможем заметить установку специальной куки, которая по умолчанию называется «PHPSESSID»:

Получение данных сессии
Теперь получим эти значения и выведем на страницу:
Удаление данных сессии
Сессия уничтожается с закрытием браузера, однако мы также можем программно удалить либо какие-то отдельные, либо все данные сессии.
# Sessions
(opens new window) to the session_start function.
Example
This feature also introduces a new php.ini setting named session.lazy_write , which defaults to true and means that session data is only rewritten, if it changes.
# Session Locking
As we all are aware that PHP writes session data into a file at server side. When a request is made to php script which starts the session via session_start() , PHP locks this session file resulting to block/wait other incoming requests for same session_id to complete, because of which the other requests will get stuck on session_start() until or unless the session file locked is not released
The session file remains locked until the script is completed or session is manually closed. To avoid this situation i.e. to prevent multiple requests getting blocked, we can start the session and close the session which will release the lock from session file and allow to continue the remaining requests.
Now one will think if session is closed how we will read the session values, beautify even after session is closed, session is still available. So, we can still read the session data.
In php >= 7.0, we can have read_only session, read_write session and lazy_write session, so it may not required to use session_write_close()
# Manipulating session data
The $_SESSION variable is an array, and you can retrieve or manipulate it like a normal array.
(opens new window) for more reference how to work on an array.
Note that if you store an object in a session, it can be retrieved gracefully only if you have an class autoloader or you have loaded the class already. Otherwise, the object will come out as the type __PHP_Incomplete_Class , which may later lead to crashes
# Warning:
(opens new window) So it can be strongly recommended to never store any personal information in $_SESSION . This would most critically include credit card numbers, government issued ids, and passwords; but would also extend into less assuming data like names, emails, phone numbers, etc which would allow a hacker to impersonate/compromise a legitimate user. As a general rule, use worthless/non-personal values, such as numerical identifiers, in session data.
# Destroy an entire session
If you’ve got a session which you wish to destroy, you can do this with session_destroy()
Using session_destroy() is different to using something like $_SESSION = array(); which will remove all of the values stored in the SESSION superglobal but it will not destroy the actual stored version of the session.
Note: We use $_SESSION = array(); instead of session_unset() because the manual
Only use session_unset() for older deprecated code that does not use $_SESSION.
# Session name
# Checking if session cookies have been created
Session name is the name of the cookie used to store sessions. You can use this to detect if cookies for a session have been created for the user:
Note that this method is generally not useful unless you really don’t want to create cookies unnecessarily.
# Changing session name
You can update the session name by calling session_name() .
If no argument is provided into session_name() then the current session name is returned.
It should contain only alphanumeric characters; it should be short and descriptive (i.e. for users with enabled cookie warnings). The session name can’t consist of digits only, at least one letter must be present. Otherwise a new session id is generated every time.
# Safe Session Start With no Errors
Many developers have this problem when they work on huge projects, especially if they work on some modular CMS on plugins, addons, components etc. Here is solution for safe session start where if first checked PHP version to cover all versions and on next is checked if session is started. If session not exists then I start session safe. If session exists nothing happen.
This can help you a lot to avoid session_start error.
# Syntax
- void session_abort ( void )
- int session_cache_expire ([ string $new_cache_expire ] )
- void session_commit ( void )
- string session_create_id ([ string $prefix ] )
- bool session_decode ( string $data )
- bool session_destroy ( void )
- string session_encode ( void )
- int session_gc ( void )
- array session_get_cookie_params ( void )
- string session_id ([ string $id ] )
- bool session_is_registered ( string $name )
- string session_module_name ([ string $module ] )
- string session_name ([ string $name ] )
- bool session_regenerate_id ([ bool $delete_old_session = false ] )
- void session_register_shutdown ( void )
- bool session_register ( mixed $name [, mixed $. ] )
- void session_reset ( void )
- string session_save_path ([ string $path ] )
- void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )
- bool session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid [, callable $validate_sid [, callable $update_timestamp ]]] )
- bool session_start ([ array $options = [] ] )
- int session_status ( void )
- bool session_unregister ( string $name )
- void session_unset ( void )
- void session_write_close ( void )
# Remarks
Note that calling session_start() even if the session has already started will result in a PHP warning.
Как использовать сессии и переменные сессий в PHP
![]()
Sajal Soni Last updated Feb 16, 2021
Russian (Pусский) translation by Ellen Nelson (you can also view the original English article)
Обработка сессии это ключевой приём в PHP, что позволяет хранить данные пользователя на всех страницах веб-сайта или приложения. Из этой статьи вы узнаете основы обработки сессии в PHP.
Мы начнем с объяснения того, как работают сессии и как они связаны с куки-файлами. Затем мы рассмотрим несколько фрагментов кода, демонстрирующих, как работать с сеансами. Вы узнаете, как создавать и уничтожать сеансы и как изменять переменные сеанса.
Что такое сессия в PHP?
Сессия — это механизм для сохранения информации на разных веб-страницах для идентификации пользователей пока они бродят по сайту или приложению. Вам интересно, почему сеансы нужны для веб-сайта? Чтобы понять, почему сеансы необходимы, нам нужно чуть вернуться назад и посмотреть, как работает HTTP-протокол.
Протокол HTTP — это протокол без учета состояния, что означает, что сервер не может сопоставить конкретного пользователя по несколькими запросами. Например, при доступе к веб-странице, сервер несёт ответственность за предоставление содержимого запрашиваемой страницы. Поэтому, когда вы обращаетесь к другим страницам одного и того же веб-сайта, веб-сервер интерпретирует каждый запрос отдельно, как если бы они не были связаны друг с другом. Серверу не известно, что каждый запрос исходит от одного и того же пользователя.
Следующая диаграмма вкратце изображает протокол HTTP.


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


Теперь, когда вы увидели краткое введение в работу сессий, мы создадим несколько практических примеров, чтобы продемонстрировать, как создавать и манипулировать переменными сессии.
Как запустить сессию
В этом разделе мы обсудим, как запустить сессию в PHP.
Всякий раз, когда вы хотите поработать с переменными сеанса, необходимо убедиться, что сеанс уже запущен. Сеанс в PHP можно запустить несколькими способами.
Использование функции session_start
Метод, в котором сессия запускается функцией session_start , вы будете видеть часто.
Важно, чтобы функция session_start вызывалась в начале скрипта, перед отправкой чего-либо браузеру. В противном случае, вы столкнётесь с печально известной ошибкой Headers are already sent .
Автоматический запуск сеанса
При необходимости применения сессий в приложении, есть возможность запускать сеанс автоматически без использования функции session_start .
В файле php.ini есть параметр session.auto_start , который позволяет запускать сеанс автоматически для каждого запроса. По умолчанию установлено значение 0 (выкл), и вы можете установить его на 1 (вкл), чтобы включить функцию автоматического запуска.
С другой стороны, если у вас нет доступа к файлу php.ini, и вы используете веб-сервер Apache, эту переменную можно задать с помощью файла .htaccess.
Если вы добавите строку выше в ваш .htaccess файл, то это должно автоматически запускать сессии в вашем PHP-приложении.
Как получить идентификатор сеанса
Как мы уже рассмотрели ранее, сервер создаёт уникальный номер для каждой новой сессии. Если вы хотите получить идентификатор сеанса, можно использовать функцию session_id , как показано в следующем фрагменте.
Это должно выдать вам идентификатор текущего сеанса. Функция идентификатора session_id интересна тем, что она ещё может принимать один аргумент — идентификатор сеанса. Если вы хотите заменить сгенерированный системой идентификатор сеанса на ваш, это можно сделать, передав первый аргумент функции session_id .
Важно отметить, что если вы хотите начать сеанс с помощью своего идентификатора сеанса, функция session_id должна стоять перед вызовом session_start .
Создание переменных сеанса
В этом разделе мы изучим, как инициализировать переменные сессии в PHP.
Как мы уже обсудили, при запуске сеанса, инициализируется суперглобальный массив $_SESSION с соответствующей информацией о сессии. По умолчанию, он инициализируется в виде пустого массива, и вы можете хранить больше информации, используя пару ключ–значение.
Давайте рассмотрим следующий пример кода, который показывает, как инициализировать переменные сеанса.
Как видите, мы запустили сессию в начале скрипта, используя функцию session_start . После этого мы инициализировали несколько переменных сессии. Наконец, мы использовали эти переменные через суперглобальную переменную $_SESSION .
При хранении данных сеанса с помощью $_SESSION , в итоге, они хранятся в соответствующем файле сессии на сервере, который был создан, когда сессия была запущена. Таким образом данные сеанса совместно используются несколькими запросами.
Как мы уже рассмотрели, информация о сессии передаётся вместе запросами, таким образом переменные сессии, инициализированные на одной странице, могут быть доступны на других страницах, а также, до окончания сессии. Как правило сессии истекают, при закрытии браузера.
Как изменять и удалять переменные сеанса
Можно изменять или удалять переменные сеанса, созданные ранее в приложении так же, как обычные переменные PHP.
Давайте посмотрим, как изменять переменные сессии.
В приведённом выше коде, мы проверяем, установлена ли переменная $_SESSION[‘count’] . Если не установлена, мы устанавливаем её равной 1 , в противном случае, увеличим её на 1 . Таким образом, если вы обновите эту страницу несколько раз, вы должны увидеть, что счётчик, каждый раз, увеличивается на единицу!
С другой стороны, если вы хотите удалить переменную сеанса, вы можете использовать функцию unset , как показано в следующем фрагменте.
Таким образом, вы больше не сможете обращаться к переменной $_SESSION [‘logged_in_user_id’] , поскольку она удалена функцией unset . Вот так вы можете изменить информацию о сеансе.
Как уничтожить сессию
В этом разделе мы увидим, как можно уничтожить сессию. В предыдущем разделе мы рассмотрели функцию unset , которая используется для удаления определённых переменных сеанса. С другой стороны, если вы хотите удалить сразу все данные, связанные с сеансом, вы можете использовать функцию session_destroy .
Попробуем понять, как это работает в следующем примере.
Функция session_destroy удаляет всё, что хранится в текущем сеансе. Таким образом, с последующими запросами вы увидите пустую переменную $_SESSION , поскольку данные сеанса, хранящиеся на диске, были удалены функцией session_destroy .
Как правило, функцию session_destroy нужно использовать, когда пользователь выходит из системы.
Заключение
В этой статье мы изучили основы обработки сеансов в PHP. Это ключевая концепция, которая позволит вам сохранять информацию для веб-страниц.
В первой половине статьи мы обсудили основные концепции сеансов, а затем мы создали несколько примеров на PHP, чтобы продемонстрировать, как вы могли создавать и уничтожать сеансы, а также манипулировать переменными сеанса.