Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Механизм сессий
 
 автор: Alex14   (09.12.2007 в 20:43)   письмо автору
 
 

Просмотрел много статей, но нигде толком о сути не говорится. Рассмотрим самый интересный случай, когда в браузере клиента кук нет, иначе сессии и не нужны. После старта сессии
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" при каждом обращении?
Зачем мне это нужно. При генерации кода визуального подтверждения скрипт каждый раз меняет соответствующую переменную в сессии. Пользователю отправилась картинка с кодом, а в это время другой пользователь зашёл и скрипт изменил код ещё до того, как первый пользователь отправит подтверждение. Тогда переменная в сессии, с которой сравнивается код, изменится, и код, отправленный первому пользователю станет неверным.

   
 
 автор: sim5   (09.12.2007 в 21:46)   письмо автору
 
   для: Alex14   (09.12.2007 в 20:43)
 

В какой статье вы прочитали, что для всех пользователей создается одна сессия?

   
 
 автор: Alex14   (09.12.2007 в 21:59)   письмо автору
 
   для: sim5   (09.12.2007 в 21:46)
 

Команда session_start() генерирует разные файлы сессий "sess_sid"? Тогда как PHP узнаёт соответствие пользователей и файлов сессий, если в строке запроса не передаются имена файлов? У меня на компьютере с выключенными куками это так.

   
 
 автор: sim5   (09.12.2007 в 22:09)   письмо автору
 
   для: Alex14   (09.12.2007 в 21:59)
 

Да разные, для каждого пользователя. В строке запроса вы так или иначе обращаетесь к какому либо файлу скрипта, либо явно, либо через параметры запроса. Сессии и куки это разные вещи - сессии живут на сервере, а куки у клиента.

   
 
 автор: Alex14   (09.12.2007 в 23:29)   письмо автору
 
   для: sim5   (09.12.2007 в 22:09)
 

Если в скрипте создаётся именованная сессия session_start("name-of-session"), то, насколько я понимаю, создаётся один файл "sess_name-of-session" и несколько файлов "sess_sid" с разными sid для каждого пользователя. Если сессия имеет имя, то все переменные пишутся в один файл "sess_name-of-session", остальные файлы ("sess_sid") пустые. У меня на компьютете так.

   
 
 автор: sim5   (10.12.2007 в 06:42)   письмо автору
 
   для: Alex14   (09.12.2007 в 23:29)
 


session_name('main');
session_start();
echo session_name();

Создается сессия с уникальным идентификатором, сессия одна, без "сородичей". Если сценарий будет запущен другим пользователем, для этого пользователя будет создана своя сессия. Какие еще несколько пустых?

   
 
 автор: Faraon   (09.12.2007 в 21:54)   письмо автору
 
   для: Alex14   (09.12.2007 в 20:43)
 

>Рассмотрим самый интересный случай, когда в браузере клиента кук нет, иначе сессии и не нужны
Интересно, Вы хоть понимаете разницу?

   
 
 автор: Alex14   (09.12.2007 в 22:01)   письмо автору
 
   для: Faraon   (09.12.2007 в 21:54)
 

Под сессиями подразумеваю использование временных файлов.

   
 
 автор: mihdan   (09.12.2007 в 23:09)   письмо автору
 
   для: Alex14   (09.12.2007 в 22:01)
 

[поправлено модератором]

   
 
 автор: Alex14   (09.12.2007 в 23:30)   письмо автору
 
   для: mihdan   (09.12.2007 в 23:09)
 

[поправлено модератором]

   
 
 автор: mihdan   (09.12.2007 в 23:33)   письмо автору
 
   для: Alex14   (09.12.2007 в 23:30)
 

[поправлено модератором]

   
 
 автор: Alex14   (09.12.2007 в 23:40)   письмо автору
 
   для: mihdan   (09.12.2007 в 23:33)
 

Да знаю я, что сессии куки тоже используют. Вопрос в том, как работают сессии в том случае, когда браузер куки не принимает.

   
 
 автор: mihdan   (09.12.2007 в 23:46)   письмо автору
 
   для: Alex14   (09.12.2007 в 23:40)
 

Если кука отрублена браузером то сессия храниться на сервере в определенной конфигурацией папке. Для каждого сеанса создается свой новый файл. Что конкретно неясно?

   
 
 автор: Alex14   (09.12.2007 в 23:55)   письмо автору
 
   для: mihdan   (09.12.2007 в 23:46)
 

mihdan
Вопрос сформулирован в первом собщении темы и ответе sim5. Меня интересуют подробности создания сессионных файлов на сервере и управления ими.

Trianon
Да, я в курсе. Но каким образом пользователи делят файл "sess_name-of-session", в котором и находятся сессионные переменные? Ведь файлы типа "sess_sid" для именованной сессии пустые.

   
 
 автор: Trianon   (10.12.2007 в 00:08)   письмо автору
 
   для: Alex14   (09.12.2007 в 23:55)
 

Нету никаких именованных сессий. Есть сессионный массив и его содержимое.

   
 
 автор: bronenos   (10.12.2007 в 01:04)   письмо автору
 
   для: Alex14   (09.12.2007 в 23:55)
 

Имя сессии указывает серверу, какое значение принять в качестве идентификатора

Зачем вам механизм?

   
 
 автор: Trianon   (09.12.2007 в 23:48)   письмо автору
 
   для: Alex14   (09.12.2007 в 23:40)
 

В этом случае идентификатор сессии передается дополнительным параметром (GET или POST) запроса.

   
 
 автор: Alex14   (11.12.2007 в 22:21)   письмо автору
 
   для: 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 работает.

   
 
 автор: Trianon   (11.12.2007 в 22:42)   письмо автору
 
   для: Alex14   (11.12.2007 в 22:21)
 

Что Вам мешает просто не трогать session_name() ?
а насчет как работает: http://phpfaq.ru/sessions

   
 
 автор: Alex14   (11.12.2007 в 22:55)   письмо автору
 
   для: Trianon   (11.12.2007 в 22:42)
 

Ничего не мешает. Просто session_name("main"), насколько понимаю, заменяет стандартное имя сессии phpsessid на "main". Так советуют делать, потому что при одновременном обращении браузера к разным серверам могут оказаться одинаковыми имена сессионных переменных, и тогда их значения перепутаются (по видимому, речь идёт о куках у клиента).

   
 
 автор: Trianon   (11.12.2007 в 23:14)   письмо автору
 
   для: Alex14   (11.12.2007 в 22:55)
 

Ерунда. Cooikies от разных серверов лежат в разных доменных пространствах клиента.

   
 
 автор: sim5   (11.12.2007 в 23:04)   письмо автору
 
   для: Alex14   (11.12.2007 в 22:21)
 

Вот немного из литературы:

Имя группы сессии
На одном и том же сайте могут существовать сразу несколько сценариев, которые нуждаются в услугах поддержки сессий PHP. Они "ничего не знают" друг о друге, поэтому временные хранилища для сессий должны выбираться не только на основе идентификатора пользователя, но и на основе того, какой из сценариев запросил обслуживание сессии. Для наглядности рассмотрим пример:

Пусть разработчик А написал сценарий счетчика. Он использует переменную $count, и не имеет никаких проблем, до тех пор, пока разработчик В, ничего не знающий о сценарии А, не создал систему статистики, которая тоже использует сессии. Самое ужасное, что он также регистрирует переменную $count, не зная о том, что она уже занята. В результате, как всегда, страдает пользователь: запустив сначало сценарий разработчика В, а потом - А, он видит, что данные счетчиков перемешались.

Нужно как-то разграничить сессии, принадлежащие одному сценарию, от сессии, принадлежащих другому. К счастью, разработчики PHP предусмотрели такое положение вещей. Можно давать группам сессии непересекающиеся имена, и сценарий, знающий имя своей группы сессии, сможет получить к ней доступ. Вот теперь-то разработчики А и В могут оградить свои сценарии от проблем с пересечением имен переменных. Достаточно в первой программе указать PHP, что будет использоваться группа с именем, например, sesA, а во второй - sesB.

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

Итак, все SID уникальны и однозначно определяют сессию на компьютере, выполняющем сценарий - независимо от имени сессии. Имя же задает пространство имен, в которое будут сгруппированны сессии, запущенные разными пользователями. Один клиент может иметь сразу несколько активных пространств имен (то есть несколько имен групп сессий).

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования