Сессии

Работа с сессиями (сеансами) в PHP 7

В данной заметке коротко о том, как использовать сеансы (сессии) в PHP, как они работают и как они связаны с файлами cookie (куки).

Что такое сессия в PHP?

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

Рекомендуется настроить путь для хранения сессий на сервере. Сделать это можно несколькими способами. Необходимо заранее создать указанные директории!

session.save_path = "/path" // Моя настройка в Windows 10 session.save_path = "S:\Server\session"
php_value session.save_path "/path" // Моя настройка в Windows 10 php_value session.save_path "S:\Server\session"

Выше варианты для глобальной конфигурации хранения сессий. Можно настраивать хранение сессий для каждого проекта отдельно. Для этого в проекте необходимо вызвать php функцию session_save_path() c указанием необходимого пути. Перед session_start() укажем путь для хранения сессий проекта:

session_save_path("S:\Server\session"); session_start();
ini_set('session.save_path', "S:\Server\session"); session_start();

Создание сессии (сеанса) в PHP

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

При каждом вызове session_start() PHP сам отправляет куку в браузер пользователя.

// Синтаксис session_start ([ array $options = array() ] ) : bool // Пример session_start ();

С помощью аргументов (ассоциативный масс $options ) можно переопределить текущие директивы конфигурации сессий, которые указаны в php.ini . Список всех директив: здесь

Запись и чтение сессий

После того, как на сервере создался файл вида sess_. , в данную сессию можно записать информацию, а так же считать её от туда.

// Запись в сессионную переменную $_SESSION['name'] = 'John'; // Чтение из сессионной переменной echo $_SESSION['name'];

Завершение (очистка) сессии

Так как сессии часто используются для авторизации пользователей, то нужно иметь механизм «выхода» из системы. Для того, чтобы завершить сессию нам нужно:

  • Очистить массив $_SESSION
  • Удалить временное хранилище (файл сессии) на сервере
  • Удалить сессионную куку (cookie).
// Очистить массив $_SESSION полностью session_unset(); // Удалить сессионную переменную unset($_SESSION['age']); // Удалить временное хранилище (файл сессии) на сервере session_destroy(); // Принудительное удаление сессионной cookie setcookie(session_name(), session_id(), time()-3600);
  • session_id() — уникальный идентификатор сессии
  • session_name() — значение идентификатора сессии
Читайте также:  Зачем linux для python

Итоги

// Создание и(или) доступ к сессии session_start(); // Запись в сессионную переменную $_SESSION['name'] = 'John'; // Чтение из сессионной переменной echo $_SESSION['name']; // Удалить сессионную переменную unset($_SESSION['age']); // Очистить массив $_SESSION полностью session_unset(); // Удалить временное хранилище (файл сессии) на сервере session_destroy(); // Принудительное удаление сессионной cookie setcookie(session_name(), session_id(), time()-3600); // Простой пример использования сессий session_save_path('С:\temp'); session_start(); if (!isset($_SESSION['counter'])) $_SESSION['counter'] = 0; echo "Вы обновили эту страницу ".$_SESSION['counter']++." раз. "; echo "
обновить";

Пример использования сессии

В данном примере я покажу как можно использовать сессии (сеансы) в PHP на практике. Для начала на сервере создадим файл index.php со следующим содержимым:

       

Создание сессии

Закрыть сессию

" method="post"> Ваше имя:
">

Ваш возраст:
">

Привет, $name!"; echo "

Тебе $age лет

"; > ?>

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

Создадим файл destroy.php . При переходе на данную страницу будем удалять сессию полностью. Если необходимо удалять и сессионную куку, воспользуйтесь функцией:

setcookie(session_name(), session_id(), time()-3600);
// Файл destroy.php       

Сессия закрыта

Создать сессию

Источник

session_save_path

session_save_path() returns the path of the current directory used to save session data.

Parameters

Session data path. If specified and not null , the path to which data is saved will be changed. session_save_path() needs to be called before session_start() for that purpose.

Note:

On some operating systems, you may want to specify a path on a filesystem that handles lots of small files efficiently. For example, on Linux, reiserfs may provide better performance than ext2fs.

Return Values

Returns the path of the current directory used for data storage, or false on failure.

Changelog

See Also

User Contributed Notes 5 notes

I made a folder next to the public html folder and placed these lines at the very first point in index.php

Location of session folder:

What I placed in index.php at line 0:

ini_set ( ‘session.save_path’ , realpath ( dirname ( $_SERVER [ ‘DOCUMENT_ROOT’ ]) . ‘/../session’ ));
session_start ();

This is the only solution that worked for me . Hope this helps someone .

Debian does not use the default garbage collector for sessions. Instead, it sets session.gc_probability to zero and it runs a cron job to clean up old session data in the default directory.

As a result, if your site sets a custom location with session_save_path() you also need to set a value for session.gc_probability, e.g.:

session_save_path ( ‘/home/example.com/sessions’ );
ini_set ( ‘session.gc_probability’ , 1 );
?>

Otherwise, old files in ‘/home/example.com/sessions’ will never get removed!

Session on clustered web servers !

We had problem in PHP session handling with 2 web server cluster. Problem was one servers session data was not available in other server.

So I made a simple configuration in both server php.ini file. Changed session.save_path default value to shared folder on both servers (/mnt/session/).

If session.save_handler is set to files, on systems that have maximum path length limitations, when the session data file’s path is too long, php may get you an error like «No such file or directory» and fails to start session, although the session-saving folder really exists on the disk.

1. Keep the session-saving folder’s absolute path not too long
2. If you’re with PHP 7.1+, don’t set session.sid_length to a number too great, such as 255

I once got stuck with this problem on Windows and wasted hours to solve it.

ini_set ( ‘session.save_path’ , realpath ( dirname ( $_SERVER [ ‘DOCUMENT_ROOT’ ]) . ‘/tmp’ ));
ini_set ( ‘session.gc_probability’ , 1 );
session_start ();

?>

(for using above code create a tmp folder/directory in your directory)

  • Session Functions
    • session_​abort
    • session_​cache_​expire
    • session_​cache_​limiter
    • session_​commit
    • session_​create_​id
    • session_​decode
    • session_​destroy
    • session_​encode
    • session_​gc
    • session_​get_​cookie_​params
    • session_​id
    • session_​module_​name
    • session_​name
    • session_​regenerate_​id
    • session_​register_​shutdown
    • session_​reset
    • session_​save_​path
    • session_​set_​cookie_​params
    • session_​set_​save_​handler
    • session_​start
    • session_​status
    • session_​unset
    • session_​write_​close

    Источник

    Как найти папку, в которой хранятся файлы сессий

    Как известно, файл сессии
    – хороший способ раскрутить локальный инклуд, но
    как же определить папку в которой они находятся?
    Ведь не всегда они хранятся в /tmp. Привожу
    излюбленные мной способы поиска заветной папки.

    1. Поиск phpinfo() на сайте.
    Для этого ищем session.save_handler. Если его
    значение установлено в «files» по дефолту,
    значит сессии хрантся в файлах, ниже находится
    значение session.save_path.

    Первое значение – это так называемое Local
    Value, уникально значение для конкретной папки и
    ее подпапок (либо для конкретного сайта),
    устанавливается в .htaccess.

    Второе значение – это Master Value , общее
    значение для всего сервера, устанавливается в
    php.ini.

    2. Поиск .htaccess, в этом
    файле может быть установлено значение php_value
    для session.save_path.

    3. Простой перебор папок.
    Привожу небольшой список возможных вариантов
    каталогов, где может находиться желаемое.

    /tmp/
    /php_sess/
    /tmp/phpsess/
    /tmp/php/
    /tmp/php-sess/
    /home/%username%/tmp/
    /var/phptemp/
    /var/phptmp/
    /var/phpsess/
    /var/php-sess/
    /var/lib/php/
    /var/lib/php/session/
    /var/lib/php3
    /var/lib/php3/session/
    /var/lib/php4/
    /var/lib/php4/session/
    /var/lib/php5/
    /var/lib/php5/session/
    /var/lib/php6/
    /var/lib/php6/session/
    /www/phpsession/
    C:\Temp
    C:\WINDOWS\Temp
    C:\PHP\sessiondata

    Источник

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