|
|
|
| Здравствуйте, уважаемые программисты!
Код:
// рассматривается ситуация, когда пользователь уже посещал сайт и имеет ID сессии в cookie
// пользователь отправляет запрос серверу
// из cookie пользователя достаём идентификатор сессии
$SID = $_COOKIE['SID'];
session_start();
|
Вопрос: каким образом функция session_start() возьмёт идентификатор сессии из $_COOKIE ?
Имеется в виду: нужно ДО определения функции session_start() принять cookie c идентификатором и записать его в переменную с зарезервированным именем, чтобы функция session_start() могла идентифицировать эту переменную?
Т.е., если я, допустим, принимаю ID cессии и записываю его в переменную с именем $SID, которое я придумал сам, то функция session_start() не определит её, как переменную содержащую ID сессии и следовательно сгенерирует новый ID ? | |
|
|
|
|
|
|
|
для: SilentChild
(12.04.2012 в 21:05)
| | зачем вам старая сессия? | |
|
|
|
|
|
|
|
для: Valick
(13.04.2012 в 01:34)
| | Я имею ввиду, что пользователь зашёл на сайт, сайт ему назначил ID сессии, попутно записав его в cookie пользователя, потом, тут же (в одно и то же время, т.е. пользователь работает с сайтом, он не уходил с него), пользователь ещё раз запросил доступ к сайту и теперь функция session_start() должна определить, что на сайт пришёл опять тот же пользователь. А определить она сможет только по ID сессии в cookie. Каким образом функция session_start() возьмёт "в себя" идентификатор из сookie? Вот то, что мне не понятно. | |
|
|
|
|
|
|
|
для: SilentChild
(13.04.2012 в 11:04)
| | Браузер передает идентификатор сессии (можете в отладчике любого браузера во вкладке Сеть это видеть).
Как будет работать механизм сессии зависит от двух параметров в php.ini:
session.use_cookies
session.use_trans_sid | |
|
|
|
|
|
|
|
для: confirm
(13.04.2012 в 12:22)
| | Предполагается, что параметр session.use_trans_sid отключён и идентификатор передаётся ТОЛЬКО через cookie пользователя.
Объясню поподробнее то, что я хочу спросить.
В общем и целом, интересует меня принцип работы функции session_start() изнутри, т.е. принципы, реализованные в её определении. Я её работу представляю так:
function session_start()
{
если $SID пуста {
1. генерируем ID сессии ;
2. создаём на сервере файл с именем совпадающим с ID cессии (т.е. c именем sess_$SID);
} в противном случае, если $SID НЕ пуста {
1. находим на сервере файл с именем совпадающим c именем sess_$SID;
}
создаём массив $_SESSION, в который вытаскиваем все данные из файла на сервере с именем сессии sess_$SID (т.е. un-сериализуем файл sess_$SID и присваиваем результат переменной $_SESSION) ;
}
|
ОЧЕНЬ грубая форма моего понимания работы функции session_start(). Интересует, как функция определяет идентификатор сессии, который прислан из cookie. У меня в определении он указан как $SID, но по такому ли имени он определяется в функции session_start() на самом деле или по какому-то другому? По умолчанию, имя переменной, которая содержит идентификатор сессии, назначается как PHPSESSID. Значит ли это то, что на самом деле функция session_start() берёт идентификатор сессии из переменной $PHPSESSID, а не из $SID? | |
|
|
|
|
|
|
|
для: SilentChild
(13.04.2012 в 12:33)
| | Да все просто - устанавливается cookie у клиента хранящий этот идентификатор, который передается серверу. А session_start() продолжает начатую сессию. Новая сессия (новый идентификатор естественно) будет открыта, если время предыдущей истекло.
Если охота слишком углубиться, то в сети ищите подробности. | |
|
|
|
|
|
|
|
для: confirm
(13.04.2012 в 12:39)
| | Т.е., функция session_start() самодостаточна?
Она автоматически, САМА принимает cookie, САМА считывает из них ID сессии, САМА присваивает кукисам ID сессии, если в них ещё не было записано ID сессии?
Т.е. такой код ...
<?php
// принимаем от браузера cookie c ID сессии и записываем их в переменную $SID
$SID = $_COOKIE['SID'];
// стартуем сессию
session_start();
// записываем в cookie идентификатор сессии сгенерированный функцией session_start() (в случае, если пользователь пришёл на сайт впервые)
$SID = session_id();
setcookie('SID', $SID, time()+33333333);
?>
|
... имеет ненужные элементы, такие как:
<?php
$SID = $_COOKIE['SID'];
...
$SID = session_id();
setcookie('SID', $SID, time()+33333333);
?>
|
т.к. абсолютно ВСЁ то, что в этих элементах упомянуто, делает функция session_start() автоматически? | |
|
|
|
|
|
|
|
для: SilentChild
(13.04.2012 в 13:01)
| | Если вас интересует непосредственно код всего происходящего, то тогда обращайтесь к исходному коду РНР.
Не сливайте все в кучу, как то чтение cookie и т.п.. Неужто трудно понять, что браузер передает в заголовке идентификатор сессии, а это означает, что не надо ничего читать. Загляните во временную папку своего локального сервера, и вы увидите там файлы сессий. Имена их, это и есть их идентификаторы. Говоря простым языком - браузер клиента сообщает серверу, что нужно продолжать работу с файлом сессии, например, sess_6c036c39991d73e38d70c9c0f120c812.
Вот и вся загадка.
$SID = $_COOKIE['SID'];
...
$SID = session_id();
и прочее, это если вам необходимо самому установить/изменить идентификатор, при этом явно записывать его в cookie клиента нет необходимости, это делается автоматически. | |
|
|
|
|
|
|
|
для: confirm
(13.04.2012 в 13:21)
| | Принцип работы сессий мне понятен. Да, интересует исходный код функции session_start(). Спасибо. А как вобще можно его "откопать" этот исходный код? Если у меня установлен PHP, можно как-нибудь из библиотек или откуда-то ещё "вытянуть" этот код? С трудом представляю, как вообще смотреть исходники программного обеспечения с открытым кодом. Дистрибутив, как и установленный PHP уже скомпилирован? Так же? Получается никак не посмотреть исходники? Нужно на каком-то ресурсе искать в сети? Не подскажете адресок где эти исходники "тусуются"? | |
|
|
|
|
|
|
|
для: SilentChild
(13.04.2012 в 13:29)
| | На официальном сайте скачивайте исходники и изучайте. | |
|
|
|
|
|
|
|
для: SilentChild
(13.04.2012 в 12:33)
| | Имя переменной хранящей идентификатор сессии устанавливается параметром session.name в php.ini
По умолчанию там прописано: session.name = PHPSESSID
Во время выполнения скрипта можно изменить это имя строкой
ini_set("session.name","new_name");
| если, конечно, это не запрещено хостером
Зная имя переменной session_start() ищет эту переменную в $_POST, $_GET и $_COOKIES. Если находит - использует указанный в ней ID. Если не находит - создает новый и сохраняет в том массиве, в котором требует php.ini | |
|
|
|
|
|
|
|
для: Sfinks
(16.04.2012 в 23:36)
| | Благодарю, Sfinks! Теперь ситуация стала более ясной. =) | |
|
|
|