Поведение интерпретатора на работу с переменными сесси когда она закрыта

alexblade

Новичок
Доброго дня.

если мы session_commit();
а потом $_SESSION['sent'] = 'Mesaj';

что происходит? она заново неявно открывается до окончания скрипта?
 

alexblade

Новичок
может ктото объяснить что происходит? почему переменая успешно присваивается и читается если мы закрыли сессию
 

wolfram

Новичок
Сессия - это файл. При открытии сессии он блокируется, если попробовать обратится к этой же сессии из другого скрипта, то он будет ждать пока не завершится первый или до вызова session_write_close(session_commit).
А собственно $_SESSION - это обычный глобальный массив с которым вы можете делать что пожелаете.

как-то так

Или вы спрашиваете как полностью прибить сессию?
 

alexblade

Новичок
не совсем. (что закрываем для деблокировки я понимаю) непонимаю следующее

например мы в середине скрипта закрываем сессию session_commit, а чуть ниже обращаемся к масиву $_SESSION (успешно). получается если мы сразу откроем и закроем сессию в первом сценарии (в первой строчке) то мы будем иметь доступ к $_SESSION и из первого и из второго скрипта (тк мы сняли блокировку и второй скрипт не будет ждать окончания первого) ?
 

wolfram

Новичок
если мы сразу откроем и закроем сессию в первом сценарии (в первой строчке) то мы будем иметь доступ к $_SESSION и из первого и из второго скрипта (тк мы сняли блокировку и второй скрипт не будет ждать окончания первого) ?
Да, все верно, если доступ к данным сессии нужен только для чтения.
 

alexblade

Новичок
вопрос имено про запись.... в первом сообщении... запись успешно работает и потом читается хотя сессия была _явно_ закрыта... что происходит , почему мы продолжаем работать с сессией как ни в чем не бывало когда она уже закрыта , баг ?
 

wolfram

Новичок
запись успешно работает и потом читается хотя сессия была _явно_ закрыта...
Попробую объяснить на примере
PHP:
session_start();

$_SESSION['test1'] = 'tmp1';
$_SESSION['test2'] = 'tmp2';
print_r($_SESSION);

session_write_close();

$_SESSION['test3'] = 'tmp3';
$_SESSION['test4'] = 'tmp4';
print_r($_SESSION);

session_start();
print_r($_SESSION);
Код:
Array
(
    [test1] => tmp1
    [test2] => tmp2
)
Array
(
    [test1] => tmp1
    [test2] => tmp2
    [test3] => tmp3
    [test4] => tmp4
)
Array
(
    [test1] => tmp1
    [test2] => tmp2
)
То что вы пишете в глобальный массив $_SESSION после закрытия сессии, к самой сессии не имеет ни какого отношения.
 

Lionishy

Новичок
По уму это называют синхронизацией.
Переменная не синхронизована с файлом автоматически, но предоставляет механизм транзакций (не знаю насколько безопасных). Вызвали session_start(); -- массив синхронизован транзакция открыта. Вызвали session_commit(); -- сессия синхронизуется с массивом, транзакция закрывается.
 

alexblade

Новичок
ага поле видимости переменной после закрытия чисто локальное а не глобальное... т.е. поле видимости объявляет откртытие/закрытии сессии а не просто использование глобального массива $_SESSION
 

haxyn

Новичок
ага поле видимости переменной после закрытия чисто локальное а не глобальное... т.е. поле видимости объявляет откртытие/закрытии сессии а не просто использование глобального массива $_SESSION
А как ты вообще съехал на "поле видимости"?
Подымай, поле видимости локальных переменных обычно ограничено классом или функцией
если ты считаешь что массив $_SESSION стал вдруг локальным то чем по твоему ограничена его видимость?!

Относись к этому проще, сессия это не какая то магическая конструкция,
как любая другая функция при старте она создаёт public массив и называет его $_SESSION
и ни какого особого "lock'a" на него не вешается, это обычный массив доступный всем для чтения/записи.

Также дела обстоят скажем с $_SERVER.
Это не прямая связь с сервером а обычный массив, которому к стати не всегда стоит доверять:
http://habrahabr.ru/post/166855/
 

alexblade

Новичок
я не считаю что $_SESSION стал локальным я понял что перменная тест3 $_SESSION['test3'] из примера выше после закрытия сессии становится видна только внутри данного скрипта
 
Сверху