Почему session_unset () не имеет никакого эффекта после session_destroy ()? - PullRequest
0 голосов
/ 06 июня 2018

Читая о session_unset () и session_destroy () Я обнаружил заметки, что destroy не очищает переменные и тому подобное.

  1. Почему приведенный ниже код не очищает $_SESSION суперглобальный элемент, который должен быть указан в документации?

  2. Документировано ли это поведение?в любом месте?

Фрагмент для воспроизведения:

#!/usr/bin/php
<?php

session_start();

$_SESSION['x'] = 1;

// If you uncomment this, `session_unset` works as intended.
session_destroy();

// It doesn't matter if you call unset, it won't have any effect
// as session_destroy was called.
session_unset();

fwrite(STDERR, var_export($_SESSION, true));
// prints: array ('x' => 1), even though session_unset was called

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Я думаю, что это поведение о реализации драйвера сеанса по умолчанию.(См. здесь ).

Когда вызывается session_destroy, PHP запускает destroy метод обработчика класса сеанса.возможно, он уничтожает только данные без прикосновения к $_SESSION, и когда вызывается session_unset, он проверяет на каждом $_SESSION элементах, если ключ элемента сохранен, он удаляет его, если нет, он ничего не делает.

Наконец, когда вы сначала вызываете session_destroy, все данные уничтожаются, поэтому session_unset ничего не может сделать, пока $_SESSION[$key] не сохраняется.

<?php
foreach($_SESSION as $key=>$value)
{
   global $data_persisted; //fictive variable containing persisted datas as array
   if(isset($data_persisted[$key])
   {
      unset($_SESSION[$key]);
   }
}

Наконец, после вызова соответствующих session_destroy и session_unset, $_SESSION все еще будут иметь свои данные.

0 голосов
/ 06 июня 2018

потому что session_destroy () удалит все сеансы, связанные с этим пользователем. здесь документ

...