Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > session_abort(), session_reset()


Автор: linuxoid 30.7.2015, 21:02
Здравствуйте, уважаемые коллеги! Пытаюсь для себя понять, в чем заключается практический смысл (а твк же принцип работы) функций session_abort() и session_reset(), которые появились в PHP 5.6. 

В http://php.net/manual/en/function.session-abort.php говорится, что session_abort() сбрасывает изменения в массиве сессии и заканчивает сессию. Т.е. по вызову этой функции сессия заканчивается без сохранения данных. Таким образом в данных сессии остаются оригинальные значения.

Каков практический смысл вышесказанного? Т.е. что значит, что значения сбрасываются и где именено? Что значит, что сессия заканчивается без сохранения данных и где остаются оригинальные значения? Для чего вообще может понадобиться что-то подобное?

Вот пример:

Код

<?php

session_start();

$_SESSION['test'] = 'foo';
$_SESSION['test'] = 'foo2';

var_dump(session_status()== PHP_SESSION_ACTIVE);

session_abort();

var_dump(session_status()== PHP_SESSION_NONE);
var_dump($_SESSION);


Вывод:
Цитата

boolean true

boolean true

array (size=1)
  'test' => string 'foo2' (length=4)


  
Судя по аутпуту, статус сессии поменялся на PHP_SESSION_NONE. $_SESSION переменная доступна и значение в ней 'foo2', а я думал будет сброс и значение будет предыдущее, т.е. 'foo'. Это первый вопрос. А второй - для чего это может быть практически применимо (т.е., что после PHP_SESSION_NONE, переменная $_SESSION всё еще содержит значения сессии).


Следующая функция session_reset() так же вызывает вопросы. Пример:
Код


<?php

session_start();

$_SESSION['test'] = 'foo';
$_SESSION['test'] = 'foo2';

var_dump(session_status()== PHP_SESSION_ACTIVE);

session_reset();

var_dump(session_status()== PHP_SESSION_ACTIVE);
var_dump($_SESSION);


Я думал, что в данном случае после вызова session_reset() будет доступна $_SESSION['test'], но вот какой получается вывод для данного примера:

Цитата

boolean true

boolean true

array (size=0)
  empty

  
Т.е. сессия хоть и активна, но данные полностью пропали. В то же время http://php.net/manual/en/function.session-reset.php говорит, что session_reset() реинициализирует сессию используя оригинальные значения, которые хранились в хранилище сессии (session storage). Эта функция требует активную сессию и сбрасывает изменения в $_SESSION. 

Не понятно, что за хранилище и что за оригинальные значения. Я думал, что это файл сессии, а значения - это предыдущие установленные (как в моем примере выше), но аутпут говорит другое. Так же хотелось бы конкретный пример, для чего данная функция может быть применена. Спасибо.

P.S. У меня PHP 5.6.3.


Автор: baldina 31.7.2015, 12:25
Цитата(linuxoid @  30.7.2015,  21:02 Найти цитируемый пост)
удя по аутпуту, статус сессии поменялся на PHP_SESSION_NONE. $_SESSION переменная доступна и значение в ней 'foo2', а я думал будет сброс и значение будет предыдущее, т.е. 'foo'

откуда там будет 'foo' если вы строчкой ниже сами его переустановили на 'foo2'?
abort() должен завершать сессию без сохранения данных. сессия завершена. какие остались данные можно узнать только открыв сессию: содержимое $_SESSION при закрытой сессии может быть любым и к сессии не относится. 

Цитата(linuxoid @  30.7.2015,  21:02 Найти цитируемый пост)
Я думал, что в данном случае после вызова session_reset() будет доступна $_SESSION['test'], но вот какой получается вывод для данного примера:

reset() должен очищать $_SESSION и считывать туда заново сохраненные ранее данные из хранилища (файла). поэтому $_SESSION['test'] "может быть доступна" только если ранее сохранялось в сессии

linuxoid, манипуляции с $_SESSION не отличаются от работы с другими переменными. 
когда сессия стартует, $_SESSION заполняется значениями из хранилища
когда скрипт завершается, данные из $_SESSION записываются в хранилище
никакой дополнительной обработки, когда вы пишете/читаете $_SESSION, не производится

Автор: linuxoid 31.7.2015, 12:31
"содержимое $_SESSION при закрытой сессии может быть любым и к сессии не относится.". Понял.
"никакой дополнительной обработки, когда вы пишете/читаете $_SESSION, не производится". Понял.

Спасибо! Разобрался. Я просто делал reset тут же, пока скрипт не завершился, поэтому он брал данные из пустого файла. Всё, что нужно было - дождаться завершения или использовать session_write_close() перед session_reset().

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)