Частично удалить/уничтожить данные $_SESSION? PHP

Я ищу способ удалить только определенные объемы данных SESSION, которые хранятся, сохраняя при этом данные сеанса, связанные с входом пользователя в систему.

На данный момент я делаю это с помощью отдельных операторов unset для переменных SESSION, которые хочу удалить.

Однако я надеялся, что может быть более умный способ просто удалить весь раздел массива SESSION, сохранив при этом определенные переменные.

e.g.

$_SESSION['username'];
$_SESSION['user_id'];
$_SESSION['ttl'];

Вариант использования для этого процесса будет следующим:

Вход пользователя --> Пользователь выполняет задачу --> После завершения задачи удалите данные сеанса, связанные с задачей --> Пользователь все еще находится в системе!

Я рассматривал возможность использования таблицы в своих логинах для мониторинга базы данных, каково ваше мнение по этому поводу?

Спасибо за ваше время!


person tomaytotomato    schedule 24.01.2012    source источник
comment
Вы можете использовать for_each для массива, чтобы сбросить все, кроме того, который вам нужен. Другой способ: вы можете сохранить переменную, которую хотите установить, $_SESSION в новый массив и вернуть в нее переменную.   -  person jakx    schedule 24.01.2012


Ответы (4)


Невозможно удалить «весь раздел массива SESSION при сохранении определенных переменных». Вместо этого вы можете использовать двумерный массив для задачи и удалить этот массив.

$_SESSION["task1"]["username"] = "name"
$_SESSION["task1"]["pass"] = "pass"

$_SESSION["task2"]["name"] = "name";

когда задача 1 завершена, удалите лайк

  unset($_SESSION["task1"]);

теперь $_SESSION["task2"] все еще существует.

person sathishkumar    schedule 24.01.2012

Ну, вы можете хранить все эти изменчивые данные внутри другого ключа:

$_SESSION['volatile'] = array(
   'one' => 'value'
);

Если вы не хотите этого делать, вы можете использовать функции сравнения массивов, например:

// specify what keys to keep
$_SESSION = array_intersect_key($_SESSION, array('keepme1', 'keepme2', 'etc'));

//specify what keys to remove
$_SESSION = array_diff_key($_SESSION, array('deleteme1', 'deleteme2', 'etc'));

Что касается БД, вы могли бы сделать это, но это не обязательно для достижения вашей цели, и если нет движущихся частей, которые вы не указали в своем исходном идентификаторе вопроса, скажите, что вам, вероятно, не нужно делать что-то сложное прямо сейчас.

person prodigitalson    schedule 24.01.2012

Структурируйте данные сеанса в иерархии:

$_SESSION['loggedIn'] = TRUE;

// Temporary session data
$_SESSION['temporary'] = array(
    'temp_var1' => 'foo',
    'temp_var2' => 'bar',
    // ...
    'temp_var99' => 'baz'
);

echo $_SESSION['temporary']['temp_var2']; // bar

// Remove all temporary session data
unset($_SESSION['temporary']);

echo $_SESSION['loggedIn'] ? 'yes' : 'no'; // yes
person FtDRbwLXw6    schedule 24.01.2012

Мне придется не согласиться с @sathishkumar, следующий метод частично уничтожает переменные сеанса.

public static function destroyPartial($keys)
{

    if (session_status() === \PHP_SESSION_NONE) {
        session_start();
    }

    if (!is_array($keys)) {
        $keys = [$keys];
    }
    foreach ($_SESSION as $k => $v) {
        if (in_array($k, $keys, true)) {
            unset($_SESSION[$k]);
        }
    }



    $recoveringSession = $_SESSION;
    session_destroy();
    session_start();
    $_SESSION = $recoveringSession;
}

В документах php для функции session_destroy мы можем прочитать это:

session_destroy() уничтожает все данные, связанные с текущим сеансом. Он не сбрасывает глобальные переменные, связанные с сеансом, и не сбрасывает файл cookie сеанса. Чтобы снова использовать переменные сеанса, необходимо вызвать session_start().

Итак, «хитрость» заключается в вызове session_start ПОСЛЕ session_destroy.

Надеюсь это поможет.

person ling    schedule 17.05.2017