Поиск…


Синтаксис

  • 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 для сеанса созданы для пользователя:

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 .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow