Учебник по основам PHP. PHPBeginner

Сессии


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

  • Пользователю, впервые посетившему сайт, присваивается уникальный идентификатор (идентификатор сессии). Этот идентификатор может быть сохранен в cookie (но не все браузеры их поддерживают) или в строке URL (тогда необходимо вносить значение идентификатора во все внутренние ссылки сайта, имеющиеся на каждой странице сайта).
  • Затем инициализируется массии, в котором будут храниться данные текущей сессии. Обычно данные сессии хранятся на сервере в файлах или базе данных.
  • В сценарии используются две основные функции: открытие сессии и внесение значения неременной в данные сессии.
  • При открытии сессии автоматически извлекаются ранее сохраненные переменные сессии.
  • При уничтожении сессии (обычно это делается автоматически, но прошествии времени устаревания) удаляются все се данные.
  • Внутренняя реализация сессий PIIP работает следующим образом. Если параметр конфигурации session.auto_start установлен (равен 1), то при запуске сценария сессия инициализируется автоматически (неявно вызывается функция session_start()). При этом проверяется существование идентификатора сессии и необходимость его создания.

    Явно добавить переменную к данным сессии позволяет функция session_register().

    Сохранение и восстановление переменных сессии определяется параметрами конфигурации track_vars (обычно он разрешен всегда) и register_globals.

    Если параметр register_g"lobals разрешен, то переменные сессии автоматически преобразуются в глобальные и обратно (также их значения доступны в массиве $HTTP_SESSION_VARS).

    <?php session_register
    ("count"): $count++: >>

    Если параметр register_globals запрещен, то тогда переменные сессии сохраняются только в глобальном ассоциативном массиве $НТТР_ SESSIONJARS.

    <?php session_register
    ("count");
    $HTTP_SESSION_VARS
    ["count"l++: ?>




    PHP может автоматически вносить идентификаторы сессий (SID) в строки локальных гиперссылок, если при компиляции был разрешен параметр —enable-trans-sid. Это бывает полезно, если браузер клиента не поддерживает cookie; иначе придется добавлять идентификаторы сессий в ссылки вручную.

    <php? # <?=SID^>
    - позволяет вывести идентификатор
    сессии
    # при интерпретации
    заменяется на значение вида
    # PHPSESSID=
    -da07977e2f4cl52f973676c41d6bd9aa ?>

    По умолчганию данные сессий сохраняются в файчах (в каталоге, указанном параметром конфигурации session.save path). Так заметно снижает быстродействие, можно использовать собственную функцию сохранения данных сессий (например, в БД) установив в качестве таковой с помощью функции session set save hand().

    session_start

    Инициализация данных сессии

    bool session_start(void)

    Создает массив данных сессии или сессии, переданный через cookie или в строке запроса, дарующая сессия уже существует) восстанавливает ранее сохраненные переменные сессии.

    Функция всегда возвращает TRUE.

    session_destroy

    Уничтожение данных сессии

    bool session_destroy(void);

    session_ name

    Определение имени сессии

    string sessionjiame ([string name])

    Возвращает имя текущей сессии, и если указан аргумент, то есть ее имя на указанное name.

    Имя сессии является именем cookies, или например в строке запросом URL. Оно должно содержать цифровые символы. По умолчанию имя устанавливается параметром session.name , файле конфигурации. Если требуется измнить его в сценарии, это должно быть сделано до открытия сессии (вызова функций session_start() или session_register()).

    <?php
    Sprevious name = session_name
    ("WebsitelD"): echo "Ранее именем
    сессии было $previous_name<p>"; ?>

    session_module_name

    Определение модуля работы с сессиями

    string session_module_name ([string module])

    Возвращает имя текущего модуля для работы с сессиями (обычно это встроенный в РНР модуль). Можно указать имя собственного модуля module, который должен использоваться вместо встроенного.



    session_save_path

    Определение каталога сохранения данных сессии string session_save_path ([string path])

    По умолчанию РНР сохраняет данные сессий в файлах, в каталоге определенном конфигурацией. Функцией возвращается имя этого каталога, и если указан аргумент, то заданный ранее каталог изменяется на указанный.

    session_ id

    Определение значения идентификатора сессии string session_id ([string id])

    Возвращает значение идентификатора текущей сессии; если указан аргумент, то заменяет его на указанное id (установить значение можно только до начала сессии).

    Значение идентификатора также хранится в константе SID.

    session_register

    Добавление переменной сессии

    bool session_register (mixed name [, mixed ...])

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

    session_unregister

    Удаление переменной сессии

    bool session_unregister (string name)

    Возвращается TRUE, если исключение переменной с именем name из данных сессии прошло успешно.

    session_unset

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

    void session_unset(void);

    Удаляет все данные текущей сессии.

    session_ is_ registered

    Проверка принадлежности переменной к текущей сессии

    bool session_is_registered (string name)

    Возвращает TRUE, если переменная с именем name принадлежит сессии.

    session_get_cookie_params

    Получение параметров cookie сессии

    array session_get_cookie_pararas (void);

    Возвращается массив, содержащий три элемента:

  • lifetime — время жизни cookie;


  • path — путь URL, для которого cookie действителен;


  • domain — домен, для которого cookie действителен.


  • session_ set_ cookie_ params

    Установка параметров cookie сессии

    void session_set_cookie_params (int lifetime [, string path [, string domain]]).

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



    session_decode

    Декодирование данных сессии из строки

    boo! session_decode (string data)

    Эта функция используется для извлечения данных сессии, если строка сериалпзированных переменных была сохранена вручную.

    session_encode

    Кодирование данных сессии в строку

    string session_encode(void)

    Возвращает строку, содержащую сериализированные данные текущей сессии.

    tession_set_save_handler

    Установление пользовательских процедур работы с сессиями

    void session_set_save_handler (string open, string close, string Aead, string write, string destroy, string gc)

    Этой функцией можно установить функции, которые будут выполнять следующие действия: открытие сессии, закрытие, чтение и запись данных сессии, уничтожение устаревших данных, вычисление момента, когда следует удалять устаревшие данные. Имена соответствующих функций указываются в этом порядке, как аргументы данной функции. Для того чтобы можно было использовать пользовательские функции, следует установить для параметра session.save_ handler в файле конфигурации значение user.

    Можно реализовать механизм сохранения данных сессий в базе данных. Следующий пример, демонстрирующий сохранение данных в файлах (примерно таким образом действует РНР), может быть лег- / ко преобразован для хранения данных в БД.

    <?Php
    // инициализация сессии
    function open ($save_path. $sesston_name)
    { global $sess_save_path. $sess_session_name:
    // здесь может выполняться подключение
    к БД $sess_save_path = $save_path;
    $sess_session_name •= $session_name: return(TRUE).
    }
    // закрытие сессии function close()
    { return(TRUE): }
    // загрузка данных сессии function
    read ($id) { global $sess_save_path.
    $sess_session_name
    $sess_file =
    "$sess_save_path/sess_$id";
    if ($fp = @fopen($sess_file. "r";)
    { $sess_data = fread
    ($fp. filesize($sess_file));
    return($sess_data): } else {
    returnC"'). }
    // сохранение данных сессии
    function write ($id. $sess_data) {
    global $sess_save_path.
    $sess_session_name:
    $sess_file = "$sess_save_path/sess_$id":
    if ($fp = @fopen($sess_file. "w"))
    { return (fwnte($fp, $sess_data));
    } else { return(FALSE): }
    } // уничтожение устаревших данных
    сессии function destroy (Sid) {
    global $sess_save_path.
    $sess_session_name:
    $sess_file = "$sess_save_path/sess_$id";
    ' return(@unlink($sess_file)); }
    // здесь должны проверяться данные
    сессии на истечение времени хранения
    function gc (Smaxlifetime) {
    return TRUE. }
    session_set_save_handler
    ("open", "close", "read", "write",
    "destroy", "gc"); session_start():
    // далее следует обычная процедура
    работы с сессиями ?>

    session_cache_limiter

    Определение ограничения кэширования

    string session_cachejimiter ([string cachejimiter])

    Когда посылаются заголовки HTTP, в них можно указать, разрешено ли кэширование полученных данных. В HTTP допустимы следующие значения: nocache (по умолчанию), private (относительное ограничение кэширования) и public (отсутствие ограничений). При запуске сценария ограничение кэширования устанавливается согласно значению параметра конфигурации session.cache_limiter.

    Функция возвращает текущее ограничение кэширования, и если указан аргумент cachejli miter, то устанавливает новое (это необходимо делать до запуска сессии).

    <?php
    session_cache_himter( 'private');
    session_start (): ?>


    Содержание раздела