Поиск…
Синтаксис
- void session_abort (void)
- int session_cache_expire ([string $ new_cache_expire])
- void session_commit (void)
- string session_create_id ([префикс строки $])
- bool session_decode (строка $ 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 (строка $ 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 (вызываемый $ open, вызываемый $ close, вызываемый $ read, вызываемый $ write, вызываемый $ destroy, вызываемый $ gc [, вызываемый $ create_sid [, вызываемый $ validate_sid [, вызываемый $ update_timestamp]]])
- bool session_start ([array $ options = []])
- int session_status (void)
- bool session_unregister (строка $ name)
- void session_unset (void)
- void session_write_close (void)
замечания
Обратите внимание, что вызов session_start()
даже если сеанс уже запущен, приведет к предупреждению PHP.
Манипулирование данными сеанса
Переменная $_SESSION
- это массив, и вы можете получить или манипулировать им, как обычный массив.
<?php
// Starting the session
session_start();
// Storing the value in session
$_SESSION['id'] = 342;
// conditional usage of session values that may have been set in a previous session
if(!isset($_SESSION["login"])) {
echo "Please login first";
exit;
}
// now you can use the login safely
$user = $_SESSION["login"];
// Getting a value from the session data, or with default value,
// using the Null Coalescing operator in PHP 7
$name = $_SESSION['name'] ?? 'Anonymous';
Также см. « Манипуляция массивом» для получения дополнительной справки о том, как работать с массивом.
Обратите внимание: если вы храните объект в сеансе, его можно получить изящно, только если у вас есть автозагрузчик класса или вы уже загрузили класс. В противном случае объект выйдет как тип __PHP_Incomplete_Class
, который позже может привести к сбоям . См. Раздел « Распространение имен» и «Автозагрузка» об автоматической загрузке.
Предупреждение:
Данные сеанса могут быть захвачены. Это описано в: Pro PHP Security: от принципов безопасности приложений до внедрения защиты XSS. Глава 7: Предотвращение захвата сеанса. Поэтому настоятельно рекомендуется никогда не хранить личную информацию в $_SESSION
. Это будет наиболее критически включать номера кредитных карт , выданные правительством идентификаторы и пароли ; но также будет распространяться на менее предполагаемые данные, такие как имена , электронные письма , номера телефонов и т. д., которые позволят хакеру олицетворять / компрометировать законного пользователя. Как правило, используйте бесполезные / неличные значения, такие как числовые идентификаторы, в данных сеанса.
Уничтожить весь сеанс
Если у вас есть сеанс, который вы хотите уничтожить, вы можете сделать это с помощью session_destroy()
/*
Let us assume that our session looks like this:
Array([firstname] => Jon, [id] => 123)
We first need to start our session:
*/
session_start();
/*
We can now remove all the values from the `SESSION` superglobal:
If you omitted this step all of the global variables stored in the
superglobal would still exist even though the session had been destroyed.
*/
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
//Finally we can destroy the session:
session_destroy();
Использование session_destroy()
отличается от использования чего-то вроде $_SESSION = array();
который удалит все значения, хранящиеся в суперзвезде SESSION
но не уничтожит фактическую сохраненную версию сеанса.
Примечание . Мы используем $_SESSION = array();
вместо session_unset()
поскольку в руководстве указано:
Используйте только session_unset () для старого устаревшего кода, который не использует $ _SESSION.
Параметры session_start ()
Начиная с сеансов PHP мы можем передать массив с параметрами php.ini
основе сеанса функции session_start
.
пример
<?php
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
// php >= 7 version
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);
} else {
// php < 7 version
session_start();
}
?>
Эта функция также вводит новый параметр php.ini
именем session.lazy_write
, который по умолчанию имеет значение true
и означает, что данные сеанса только перезаписываются, если он изменяется.
Ссылка: https://wiki.php.net/rfc/session-lock-ini
Название сеанса
Проверка наличия файлов cookie сеанса
Имя сеанса - это имя файла cookie, используемого для хранения сеансов. Вы можете использовать это, чтобы определить, были ли файлы cookie для сеанса созданы для пользователя:
if(isset($_COOKIE[session_name()])) {
session_start();
}
Обратите внимание, что этот метод обычно не полезен, если вы действительно не хотите создавать файлы cookie без необходимости.
Изменение имени сеанса
Вы можете обновить имя сеанса, вызвав session_name()
.
//Set the session name
session_name('newname');
//Start the session
session_start();
Если аргумент не session_name()
в session_name()
то возвращается текущее имя сеанса.
Он должен содержать только буквенно-цифровые символы; он должен быть коротким и описательным (т.е. для пользователей с включенными предупреждениями cookie). Имя сеанса не может состоять только из цифр, должно присутствовать хотя бы одна буква. В противном случае каждый раз генерируется новый идентификатор сеанса.
Блокировка сеанса
Поскольку все мы знаем, что PHP записывает данные сеанса в файл со стороны сервера. Когда запрос делается на php-скрипт, который запускает сеанс через session_start()
, PHP блокирует этот файл сеанса, в результате которого блокируются / ждут другие входящие запросы для того же самого session_id
, из-за чего другие запросы будут застревать в session_start()
до тех пор, пока или если файл сеанса не заблокирован
Файл сеанса остается заблокированным до завершения скрипта или сеанса вручную закрывается. Чтобы избежать этой ситуации, т. Е. Предотвратить блокирование множества запросов , мы можем начать сеанс и закрыть сеанс, который освободит блокировку из файла сеанса и позволит продолжить оставшиеся запросы.
// php < 7.0
// start session
session_start();
// write data to session
$_SESSION['id'] = 123; // session file is locked, so other requests are blocked
// close the session, release lock
session_write_close();
Теперь можно подумать, что если сеанс закрыт, как мы будем считывать значения сеанса, украшать даже после закрытия сеанса, сеанс по-прежнему доступен. Итак, мы все еще можем прочитать данные сеанса.
echo $_SESSION['id']; // will output 123
В php> = 7.0 мы можем иметь сеанс read_only, сеанс read_write и сеанс lazy_write , поэтому может не потребоваться использование session_write_close()
Безопасное начало сеанса без ошибок
У многих разработчиков есть эта проблема, когда они работают над огромными проектами, особенно если они работают над некоторыми модульными CMS на плагинах, дополнениях, компонентах и т. Д. Вот решение для безопасного запуска сеанса, где, если сначала проверить версию PHP, чтобы охватить все версии, а затем проверить если сеанс запущен. Если сеанс не существует, я начинаю безопасный сеанс. Если сеанс не существует, ничего не происходит.
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
if(session_status() == PHP_SESSION_NONE) {
session_start(array(
'cache_limiter' => 'private',
'read_and_close' => true,
));
}
}
else if (version_compare(PHP_VERSION, '5.4.0') >= 0)
{
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
}
else
{
if(session_id() == '') {
session_start();
}
}
Это может помочь вам избежать ошибки session_start
.