суббота, 15 мая 2010 г.

Работа с сессиями

Продолжаю писать тестовое задание по пхп. Решил не искать легких путей и разобраться в вопроссе сессий глубоко. Тем более они мне показались мутным делом.
Есть вариант, что это все легко. Но как всегда есть но!
И так сессии, в последних версиях пхп этот процесс сделали полнстью атоматизированным и почти не нужно о нем беспокоится. Поведение сессий настраивается в php.ini, а также есть функции переопределия настроек в режиме выполнения (и это не только set_ini()).
Первое на что нужно обратить внимание это
session.save_handler = file
Это значени по умолчанию, оно означает что движок пхп пишет сессии в файлы в папке
session.save_path = "..."
Дальше то, что я и так буду помнить.
А вот тонкости:
bool session_set_save_handler ( callback $open , callback $close , callback $read , callback $write , callback $destroy ,callback $gc )
Этим колбекам можно поставить свои функции, в которых сохранять сессии например в базу данных. Нужно помнить, что если колбеки - методы обьекта, то метод $write и $close не вызовутся, потому что они срабатывают после отработки деструуторов всех обьектов. Но есть выход в деструкторе до разрушения обьекта вызвать функцию session_write_close(), которая заствит пхп движок проделать запись и закрытие сессии до уничножения обьекта с нашими подменными колбеками.
Есть еще над чем подумать по поводу сборщика муссора -- он срабатывает редко и чистит все устаревшие сесси. Но наверно точно также себя ведет, как райт и клоз. Это нужно проверять...(Вот проверил - все работает с session_write_close() в деструкторе).
Габидж колектор настраивается так
session.gc_probability = 1
session.gc_divisor     = 1000
Это означает что колектор вызовется на 1000-й запрос к серверу.
session.gc_maxlifetime = 1440
А этот параметр устанавливает, сколько времени не обновленная сессия считается активной -- все сессии которые старше этого возраста будут удалены.

Принцип работы по умолчанию: рид серилизирует с файла, в имени которого содержится идентификатор сессии, массив
 $_SESSION, то есть переменные которые находились в этом массиве во время прошлого запроса, будут снова доступные с теми же значениями.
Райт же серилизирует массив $_SESSION в файл.
Серилизатор настраивается в
session.serialize_handler = php
По умолчанию, как видно устанавливается пхпешный стандратный.
По последнему татчу (обновлению-"серилизации в") файла можно узнать возраст сессии, что и делает колектор. Если файл черезчур староват, то он удаляется. Если придет запрос с идентификатором и пхп не найдет файл с таким именем, то он поймет, что колектор его уже удалил и создаст новый файл с новым именем, и это имя отправится клиенту -- так создастся новая сессия.
Заметил еще одну фишку с MySQL -- когда тип таблиц MyISAM, то демон не реагирет на ошибки во внешних ключах, а если innoDB -- то реагирует. От сюда напрашивается вывод что первый тип не связывает таблицы -- но это нужно выяснять.
Были проблемы с пропажей соединения в базу -- сделал одно соединение к базе через синглтон и привязку его ссылки к обьектам для работы с базой -- все ок. Синглтон разрушался последним и все записи сессий производились в базу на ура!

Комментариев нет:

Отправить комментарий