Работа с сессиями в PHP
Сессия, механизм php, созданный для возможности передачи данных предназначенных конкретному пользователю при повторных запросах (веб-сервер не поддерживает постоянного соединения с клиентом, и каждый запрос обрабатывается, как новый, без какой-либо связи с предыдущими).
Принцип работы сессий: сервер выдает браузеру уникальный идентификатор, и просит передавать его с каждым запросом. Передача происходит стандартными способами, либо через куки, либо через переменные POST/GET.
Идентификатор сессии — это обычная переменная, по умолчанию ее имя — PHPSESSID. Можно изменить директивой session.name в php.ini.
На сервере за передачу информации о сессиях отвечают две настройки в php.ini:
- session.use_cookies — если равно 1, то PHP передает идентификатор в куках, если 0 — то нет.
- session.use_trans_sid — если равно 1, то PHP передает его, добавляя к URL и формам, если 0 — то нет.
Соответственно, если включена только первая настройка и браузер отдает куки, то идентификатор передается через них, если не отдает, то сессия обнуляется при каждом запросе.
Если включена только вторая, то PHP дописывает к каждой относительной ссылке и к каждой форме передачу идентификатора сессии, примерно так:
Если включены обе, то браузеру выставляется кука, а ссылки и формы дополняются только если кука найдена не была.
Вся информация о сессии храниться в глобальном массиве $_SESSION.
Запись данных в сессию работает так:
// запускаем новую, либо возобновляем существующую сессию session_start(); // передаем в массив сессий переменную с названием test и данными Hello world $_SESSION['test']='Hello world!'; // если в качестве имени переменной хотим использовать значение переменной - // пишем без кавычек или используем двойные $var = name; $_SESSION["$var"]='Hello world!';
// обычное условие проверки if(!$_SESSION[$var]){ echo "session variable is empty" } // можно получить id текущей сессии или ее имя session_id(); session_name();
Удаление переменных из сессии:
unset($_SESSION[$var]); // Если register_globals = on, надо добавить строку session_unregister($var); //Если надо сбросить все переменные сессии session_unset();
Для закрытия сессии используется функция:
Данные из глобального массива $_SESSION php хранит либо в файлах, путь к которым указывается в session.save_path в php.ini, либо в БД.
Для управления HTTP-заголовками отвечающими за кэш, используется функция session_cache_limiter(). Установка nocache, например, отменяет кэширование на стороне клиента.
Во время начала запроса режим кеширования сбрасывается до значения по умолчанию, хранящегося в session.cache_limiter. Таким образом, вам необходимо вызывать session_cache_limiter() для каждого запроса (перед тем, как вызвана функция session_start()).
Значение | Посылаемый заголовок |
---|---|
public | Expires: (когда-нибудь в будущем, в зависимости от session.cache_expire) Cache-Control: public, max-age=(когда-нибудь в будущем, в зависимости от session.cache_expire) Last-Modified: (временная метка последнего сохранения сессии) |
private_no_expire | Cache-Control: private, max-age=(session.cache_expire в будущем), pre-check=(session.cache_expire в будущем) Last-Modified: (временная метка последнего сохранения сессии) |
private | Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: private, max-age=(session.cache_expire в будущем), pre-check=(session.cache_expire в будущем) Last-Modified: (временная метка последнего сохранения сессии) |
nocache | 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 |
Возможные проблемы
- Вспомогательными вещами, вроде кодирования данных и удаления старых сессий, php занимается сам, и если возникает проблема с удалением информации о них, проверьте в php.ini строку session.gc_probability. Для того чтобы php мог самостоятельно удалять файлы сессий, должно быть установлено 1.
- Warning: open(/tmp\sess_SID, O_RDWR) failed: No such file or directory (2) in full_script_path on line number
или
Warning: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp))
в этом случае надо в php.ini, в параметре session.save_path, указать правильный каталог, который существует и доступен для записи (не забудьте перезагрузить апач). - Warning: Cannot send session cookie — headers already sent.
Warning: Cannot send session cache limiter — headers already sent.
Warning: Cannot add header information — headers already sent.
эти ошибки возникают в том случае, если браузер ранее уже получил заголовки для страницы. Функции header(), session_start(), setcookie() и вся логика, которая их вызывает, должны обрабатываться до любого вывода в браузер. - Если давать переменным скрипта имена, совпадающие с индексами массива $_SESSION, возможны проблемы. При register_globals=on значения будут перезаписывать друг друга. При register_globals=off, в случае, если в скрипте есть переменная сессии не имеющая значения, и глобальная переменная с тем же именем, появится ошибка «Your script possibly relies on a session side-effect which existed until PHP 4.2.3.». Для предотвращения этой ошибки, надо инициализировать переменные перед использованием или проверять на существование, и стараться не давать глобальным переменным имена, совпадающие с индексами массива $_SESSION.
- Если вы используете перенаправление через header или навигацию с помощью JavaScript, PHP не пропишет необходимый идентификатор, т.к. он работает только со статичными ссылками. В этом случае надо проставлять идентификатор самостоятельно:
header("Location: /script.php?".session_name().'='.session_id());
Более детальный обзор можно найти на сайте phpfaq.ru
session_register
session_register() принимает переменное число аргументов, любой из которых может быть либо строкой, содержащей имя переменной, либо массивом, состоящим из имен переменных или других массивов. Для каждого имени, session_register() регистрирует глобальную переменную с таким именем в текущей сессии.
Вы также можете создать переменную сессии, просто установив соответствующий элемент в массиве $_SESSION .
// Использование session_register() объявлено устаревшим
$barney = «Большой фиолетовый динозавр.» ;
session_register ( «barney» );
?php
// Использование $_SESSION является предпочтительным
$_SESSION [ «zim» ] = «Захватчик с другой планеты.» ;
?>
Если функция session_start() не была вызвана перед этой, то произойдет неявный вызов session_start() без параметров. В случае использования $_SESSION этого не произойдет, следовательно необходимо самостоятельно вызвать session_start() .
Данная функция была объявлена УСТАРЕВШЕЙ, начиная с PHP 5.3.0 и была УДАЛЕНА в PHP 5.4.0.
Список параметров
Строка, содержащая имя переменной, либо массив, состоящий из имен переменных или других массивов.
Возвращаемые значения
Возвращает true в случае успешного завершения или false в случае возникновения ошибки.
Примечания
Если вы хотите, чтобы ваш скрипт работал независимо от register_globals, вам нужно использовать массив $_SESSION , так как записи $_SESSION будут автоматически зарегистрированы. Если ваш скрипт использует session_register() , она не будет работать в условиях, когда директива PHP register_globals отключена.
Замечание: register_globals: важное замечание
Начиная с PHP 4.2.0, значением директивы PHP register_globals по умолчанию является off (выключено). Сообщество PHP рекомендует не полагаться на эту директиву, а использовать вместо этого иные средства, такие как superglobals.
Эта функция регистрирует глобальную переменную. Если вы хотите зарегистрировать сессионную переменную изнутри функции, вы должны сделать эту переменную глобальной с помощью ключевого слова global или с помощью суперглобального массива $GLOBALS[] , или использовать специальные сессионные массивы, указанные ниже.
Если вы используете $_SESSION , не используйте session_register() , session_is_registered() , и session_unregister() .
Замечание:
Это в настоящее время невозможно зарегистрировать в сессии переменнтую типа resource . Например, вы не можете создать подключение к базе данных, хранить идентификатор соединения как переменную сессии и ожидать подключения к БД по этому идентификатору после восстановления сессии. Функции PHP, которые возвращают ресурсы, имеют в описании тип возвращаемого значения resource . Список таких функций можно посмотреть в приложении типы ресурсов.
Если используются $_SESSION , присваитвайте значения $_SESSION . Пример: $_SESSION[‘var’] = ‘ABC’;
Смотрите также
- session_is_registered() — Определяет, зарегистрирована ли глобальная переменная в сессии
- session_unregister() — Отмена регистрации глобальной переменной в текущей сессии
- $_SESSION
session_register
session_register() accepts a variable number of arguments, any of which can be either a string holding the name of a variable or an array consisting of variable names or other arrays. For each name, session_register() registers the global variable with that name in the current session.
You can also create a session variable by simply setting the appropriate member of the $_SESSION or $HTTP_SESSION_VARS (PHP < 4.1.0) array.
// Use of session_register() is deprecated
$barney = «A big purple dinosaur.» ;
session_register ( «barney» );
?php
// Use of $_SESSION is preferred, as of PHP 4.1.0
$_SESSION [ «zim» ] = «An invader from another planet.» ;
// The old way was to use $HTTP_SESSION_VARS
$HTTP_SESSION_VARS [ «spongebob» ] = «He’s got square pants.» ;
?>
If session_start() was not called before this function is called, an implicit call to session_start() with no parameters will be made. $_SESSION does not mimic this behavior and requires session_start() before use.
Данная функция была помечена УСТАРЕВШЕЙ начиная с версии PHP 5.3.0 и была УДАЛЕНА в версии PHP 5.4.0.
Список параметров
A string holding the name of a variable or an array consisting of variable names or other arrays.
Возвращаемые значения
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Примечания
If you want your script to work regardless of register_globals, you need to instead use the $_SESSION array as $_SESSION entries are automatically registered. If your script uses session_register() , it will not work in environments where the PHP directive register_globals is disabled.
Замечание: register_globals: важное замечание
Начиная с PHP 4.2.0, значением директивы PHP register_globals по умолчанию является off (выключено). Сообщество PHP рекомендует не полагаться на эту директиву, а использовать вместо этого иные средства, такие как superglobals.
This registers a global variable. If you want to register a session variable from within a function, you need to make sure to make it global using the global keyword or the $GLOBALS[] array, or use the special session arrays as noted below.
If you are using $_SESSION (or $HTTP_SESSION_VARS ), do not use session_register() , session_is_registered() , and session_unregister() .
Замечание:
It is currently impossible to register resource variables in a session. For example, you cannot create a connection to a database and store the connection id as a session variable and expect the connection to still be valid the next time the session is restored. PHP functions that return a resource are identified by having a return type of resource in their function definition. A list of functions that return resources are available in the resource types appendix.
If $_SESSION (or $HTTP_SESSION_VARS for PHP 4.0.6 or less) is used, assign values to $_SESSION . For example: $_SESSION[‘var’] = ‘ABC’;
Смотрите также
- session_is_registered() — Определяет, зарегистрирована ли глобальная переменная в сессии
- session_unregister() — Unregister a global variable from the current session
- $_SESSION