Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > session_write_close


Автор: animegirl 31.8.2012, 03:53
Такой технический вопрос.
Прочитала в мануале следующие:
Цитата

Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time. When using framesets together with sessions you will experience the frames loading one by one due to this locking. You can reduce the time needed to load all the frames by ending the session as soon as all changes to session variables are done.


И задумалась, блокировка начинается после session_start(); или после первого изменения в супермасиве $_SESSION?

Добавлено через 3 минуты и 10 секунд
И если после старта, имеет ли смысл закрывать сразу сессию, и открывать её заного в одном скрипте?
Или как вариант открывать, копировать массив, закрывать, а в конце скрипта, ещё раз скидывать обратно обновления?

Автор: Sanchezzz 31.8.2012, 06:26
Это механизм работает так

Открыли сессию создался пустой файл или считался и получили глобальный массив $_SESSION

после того как что то сделали и скрипт завершил выполнения данные записываются
если вызвать session_destroy то данные удаляются.

Механизм сессии и хранения данных можно изменять фактически он меняется при 2 случаях с ростом проекта и когда нужно организовать сессии на несколько машинах одни и теже.


Код

// Переопределения методы сессии на свои  функций 
// PS $self_handle_driver это объект класса что бы показать откуда брать функцию грубо говоря)))
session_set_save_handler(
    array($self_handle_driver, "open"),     // при открытии сессии
    array($self_handle_driver, "close"),     // при завершении сессии
    array($self_handle_driver, "read"),      // чтение
    array($self_handle_driver, "write"),     // запись
    array($self_handle_driver, "destroy"), // уничтожение сессии
    array($self_handle_driver, "gc")          // авто очистка сессии 
);
register_shutdown_function('session_write_close');
session_start();


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

Пока  не забыл хранения сессии можно организовать где угодно файле(стандартный механизм) оператива (memcache)  БД, и другие кеш системы которых более 5+.

Автор: animegirl 31.8.2012, 13:04
На данный момент оставляю файловые сессии, вопрос в другом, имеет смысл их закрывать в ручную, или забить на это?
Я в них храню ещё некоторые данные часто используемые, как например тот же ИД юзера, зачем каждый раз базу напрягать такими вопросами.

Автор: animegirl 31.8.2012, 16:48
Я сейчас заметила интересную вещь, не смотря на то, что закрыла сессию, всё равно могу туда записи делать. В чём тогда смысл?

Автор: Sanchezzz 1.9.2012, 19:20
Цитата

Я сейчас заметила интересную вещь, не смотря на то, что закрыла сессию, всё равно могу туда записи делать. В чём тогда смысл? 

Нужно смотреть конкретный пример в моем случаи работает как надо 
Код

session_start();
    print_r($_SESSION);
    
    $_SESSION['test1'] = '1';
    session_write_close();
    $_SESSION['test2'] = '2';


1 запуск выдаст пустой массив
2 запуск вернет только ['test1'] =1;

Причем если что то добавленное было $_SESSION то оно там хранится до тех пор пока его не удалят например тем же unset
Было бы интресно посмотреть на ваш пример.

Автор: animegirl 1.9.2012, 22:58
Сейчас глянула, всё-таки я профукала, не записывается, там видимо когда проверяла, была старая запись, я решила, что всё равно работает  smile

Добавлено через 1 минуту и 14 секунд
Но кстати, на данный момент, я всё же решила закрывать запись, так как у меня больше чтения в коде, нежели записей.

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