|
|
|
| Просмотрел много статей, но нигде толком о сути не говорится. Рассмотрим самый интересный случай, когда в браузере клиента кук нет, иначе сессии и не нужны. После старта сессии
session_start();
в каталоге "c:/php/tmp/" (или в каком-то другом) создаётся файл с именем "sess_sid", где sid - идентификатор сессии (выдаваемый функцией session_id()). В этом файле сохраняются переменные сессии, по мере выполнения скрипта, путём присвоений типа $_SESSION['var'] = $var;. Если создать именованную сессию командой
session_name("Name-of-session"), то переменные будут сохраняться в файле "sess_name-of-session", а файл "sess_id" тоже создастся, но будет пустым.
Вопрос: Зачем в этом случае нужен второй файл "sess_sid"?
Если к скрипту, генерирующему сессии, одновременно обращаются несколько человек, то будет ли изменяться содержимое "sess_name-of-session" при каждом обращении?
Зачем мне это нужно. При генерации кода визуального подтверждения скрипт каждый раз меняет соответствующую переменную в сессии. Пользователю отправилась картинка с кодом, а в это время другой пользователь зашёл и скрипт изменил код ещё до того, как первый пользователь отправит подтверждение. Тогда переменная в сессии, с которой сравнивается код, изменится, и код, отправленный первому пользователю станет неверным. | |
|
|
|
|
|
|
|
для: Alex14
(09.12.2007 в 20:43)
| | В какой статье вы прочитали, что для всех пользователей создается одна сессия? | |
|
|
|
|
|
|
|
для: sim5
(09.12.2007 в 21:46)
| | Команда session_start() генерирует разные файлы сессий "sess_sid"? Тогда как PHP узнаёт соответствие пользователей и файлов сессий, если в строке запроса не передаются имена файлов? У меня на компьютере с выключенными куками это так. | |
|
|
|
|
|
|
|
для: Alex14
(09.12.2007 в 21:59)
| | Да разные, для каждого пользователя. В строке запроса вы так или иначе обращаетесь к какому либо файлу скрипта, либо явно, либо через параметры запроса. Сессии и куки это разные вещи - сессии живут на сервере, а куки у клиента. | |
|
|
|
|
|
|
|
для: sim5
(09.12.2007 в 22:09)
| | Если в скрипте создаётся именованная сессия session_start("name-of-session"), то, насколько я понимаю, создаётся один файл "sess_name-of-session" и несколько файлов "sess_sid" с разными sid для каждого пользователя. Если сессия имеет имя, то все переменные пишутся в один файл "sess_name-of-session", остальные файлы ("sess_sid") пустые. У меня на компьютете так. | |
|
|
|
|
|
|
|
для: Alex14
(09.12.2007 в 23:29)
| |
session_name('main');
session_start();
echo session_name();
|
Создается сессия с уникальным идентификатором, сессия одна, без "сородичей". Если сценарий будет запущен другим пользователем, для этого пользователя будет создана своя сессия. Какие еще несколько пустых? | |
|
|
|
|
|
|
|
для: Alex14
(09.12.2007 в 20:43)
| | >Рассмотрим самый интересный случай, когда в браузере клиента кук нет, иначе сессии и не нужны
Интересно, Вы хоть понимаете разницу? | |
|
|
|
|
|
|
|
для: Faraon
(09.12.2007 в 21:54)
| | Под сессиями подразумеваю использование временных файлов. | |
|
|
|
|
|
|
|
для: Alex14
(09.12.2007 в 22:01)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: mihdan
(09.12.2007 в 23:09)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: Alex14
(09.12.2007 в 23:30)
| | [поправлено модератором] | |
|
|
|
|
|
|
|
для: mihdan
(09.12.2007 в 23:33)
| | Да знаю я, что сессии куки тоже используют. Вопрос в том, как работают сессии в том случае, когда браузер куки не принимает. | |
|
|
|
|
|
|
|
для: Alex14
(09.12.2007 в 23:40)
| | Если кука отрублена браузером то сессия храниться на сервере в определенной конфигурацией папке. Для каждого сеанса создается свой новый файл. Что конкретно неясно? | |
|
|
|
|
|
|
|
для: mihdan
(09.12.2007 в 23:46)
| | mihdan
Вопрос сформулирован в первом собщении темы и ответе sim5. Меня интересуют подробности создания сессионных файлов на сервере и управления ими.
Trianon
Да, я в курсе. Но каким образом пользователи делят файл "sess_name-of-session", в котором и находятся сессионные переменные? Ведь файлы типа "sess_sid" для именованной сессии пустые. | |
|
|
|
|
|
|
|
для: Alex14
(09.12.2007 в 23:55)
| | Нету никаких именованных сессий. Есть сессионный массив и его содержимое. | |
|
|
|
|
|
|
|
для: Alex14
(09.12.2007 в 23:55)
| | Имя сессии указывает серверу, какое значение принять в качестве идентификатора
Зачем вам механизм? | |
|
|
|
|
|
|
|
для: Alex14
(09.12.2007 в 23:40)
| | В этом случае идентификатор сессии передается дополнительным параметром (GET или POST) запроса. | |
|
|
|
|
|
|
|
для: Trianon
(09.12.2007 в 23:48)
| | После
session_name("main");
session_start();
...
$_SESSION["var"] = $var;
...
|
в каталоге "c:/php/tmp/" создадутся два файла: "sess_main", в который пишутся сессионные переменные, и пустой файл "sess_sid", где sid = session_id("main"). Команда session_id() выдаст "main". Если этот же скрипт запустить с заново запущенного браузера, то в каталоге "c:/php/tmp/" добавится ещё один пустой файл "sess_sid" с другим sid. А в файле "sess_main" старые сессионные переменные перепишутся новыми. Тем не менее всё почему-то работает, т.е. php помнит и те переменные, которые были записаны в сессию скриптом, запущенным при обращении первого браузера. Может кроме временных файлов они ещё в оперативной памяти хранятся? И ссылки в адресной строке не дополняются (у меня session.use_trans_sid = 0 в php.ini), хотя куки отключил, сервер всё равно браузеры различает.
Всё это непонятно для меня, чёрный ящик какой-то. Сдаётся мне, что проще самому сессии с дополнением url организовать, чем разобраться как это в php работает. | |
|
|
|
|
|
|
|
для: Alex14
(11.12.2007 в 22:21)
| | Что Вам мешает просто не трогать session_name() ?
а насчет как работает: http://phpfaq.ru/sessions | |
|
|
|
|
|
|
|
для: Trianon
(11.12.2007 в 22:42)
| | Ничего не мешает. Просто session_name("main"), насколько понимаю, заменяет стандартное имя сессии phpsessid на "main". Так советуют делать, потому что при одновременном обращении браузера к разным серверам могут оказаться одинаковыми имена сессионных переменных, и тогда их значения перепутаются (по видимому, речь идёт о куках у клиента). | |
|
|
|
|
|
|
|
для: Alex14
(11.12.2007 в 22:55)
| | Ерунда. Cooikies от разных серверов лежат в разных доменных пространствах клиента. | |
|
|
|
|
|
|
|
для: Alex14
(11.12.2007 в 22:21)
| | Вот немного из литературы:
Имя группы сессии
На одном и том же сайте могут существовать сразу несколько сценариев, которые нуждаются в услугах поддержки сессий PHP. Они "ничего не знают" друг о друге, поэтому временные хранилища для сессий должны выбираться не только на основе идентификатора пользователя, но и на основе того, какой из сценариев запросил обслуживание сессии. Для наглядности рассмотрим пример:
Пусть разработчик А написал сценарий счетчика. Он использует переменную $count, и не имеет никаких проблем, до тех пор, пока разработчик В, ничего не знающий о сценарии А, не создал систему статистики, которая тоже использует сессии. Самое ужасное, что он также регистрирует переменную $count, не зная о том, что она уже занята. В результате, как всегда, страдает пользователь: запустив сначало сценарий разработчика В, а потом - А, он видит, что данные счетчиков перемешались.
Нужно как-то разграничить сессии, принадлежащие одному сценарию, от сессии, принадлежащих другому. К счастью, разработчики PHP предусмотрели такое положение вещей. Можно давать группам сессии непересекающиеся имена, и сценарий, знающий имя своей группы сессии, сможет получить к ней доступ. Вот теперь-то разработчики А и В могут оградить свои сценарии от проблем с пересечением имен переменных. Достаточно в первой программе указать PHP, что будет использоваться группа с именем, например, sesA, а во второй - sesB.
Идентификатор сессии
Идентификатор сессии является именем временного хранилища, которое будет использовано для хранения данных сессии между запусками сценария. Один SID - одно хранилище. Нет SID, нет и хранилища, и наоботот. Как же соотностится идентификатор и имя группы? Имя - это всего лишь собирательное название для нескольких сессий (то есть, для многих SID), запущенных разными пользователями. Один и тот же клиент никогда не будет иметь два различных SID в пределах одного имени группы. Но его браузер вполне может работать с несколькими SID, расположенными логически в разных "пространствах имен".
Итак, все SID уникальны и однозначно определяют сессию на компьютере, выполняющем сценарий - независимо от имени сессии. Имя же задает пространство имен, в которое будут сгруппированны сессии, запущенные разными пользователями. Один клиент может иметь сразу несколько активных пространств имен (то есть несколько имен групп сессий). | |
|
|
|