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

Форум PHP

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

 

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

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

тема: Идентификация ID сессии или работа функции session_start() изнутри
 
 автор: SilentChild   (12.04.2012 в 21:05)   письмо автору
 
 

Здравствуйте, уважаемые программисты!

Код:

// рассматривается ситуация, когда пользователь уже посещал сайт и имеет ID сессии в cookie
// пользователь отправляет запрос серверу
// из cookie пользователя достаём идентификатор сессии 

$SID = $_COOKIE['SID'];  

session_start();


Вопрос: каким образом функция session_start() возьмёт идентификатор сессии из $_COOKIE ?
Имеется в виду: нужно ДО определения функции session_start() принять cookie c идентификатором и записать его в переменную с зарезервированным именем, чтобы функция session_start() могла идентифицировать эту переменную?

Т.е., если я, допустим, принимаю ID cессии и записываю его в переменную с именем $SID, которое я придумал сам, то функция session_start() не определит её, как переменную содержащую ID сессии и следовательно сгенерирует новый ID ?

  Ответить  
 
 автор: Valick   (13.04.2012 в 01:34)   письмо автору
 
   для: SilentChild   (12.04.2012 в 21:05)
 

зачем вам старая сессия?

  Ответить  
 
 автор: SilentChild   (13.04.2012 в 11:04)   письмо автору
 
   для: Valick   (13.04.2012 в 01:34)
 

Я имею ввиду, что пользователь зашёл на сайт, сайт ему назначил ID сессии, попутно записав его в cookie пользователя, потом, тут же (в одно и то же время, т.е. пользователь работает с сайтом, он не уходил с него), пользователь ещё раз запросил доступ к сайту и теперь функция session_start() должна определить, что на сайт пришёл опять тот же пользователь. А определить она сможет только по ID сессии в cookie. Каким образом функция session_start() возьмёт "в себя" идентификатор из сookie? Вот то, что мне не понятно.

  Ответить  
 
 автор: confirm   (13.04.2012 в 12:22)   письмо автору
 
   для: SilentChild   (13.04.2012 в 11:04)
 

Браузер передает идентификатор сессии (можете в отладчике любого браузера во вкладке Сеть это видеть).
Как будет работать механизм сессии зависит от двух параметров в php.ini:
session.use_cookies
session.use_trans_sid

  Ответить  
 
 автор: SilentChild   (13.04.2012 в 12:33)   письмо автору
 
   для: 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?

  Ответить  
 
 автор: confirm   (13.04.2012 в 12:39)   письмо автору
 
   для: SilentChild   (13.04.2012 в 12:33)
 

Да все просто - устанавливается cookie у клиента хранящий этот идентификатор, который передается серверу. А session_start() продолжает начатую сессию. Новая сессия (новый идентификатор естественно) будет открыта, если время предыдущей истекло.
Если охота слишком углубиться, то в сети ищите подробности.

  Ответить  
 
 автор: SilentChild   (13.04.2012 в 13:01)   письмо автору
 
   для: 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'$SIDtime()+33333333);
?>

... имеет ненужные элементы, такие как:

<?php
$SID 
$_COOKIE['SID'];
...

$SID session_id();
setcookie('SID'$SIDtime()+33333333);
?>

т.к. абсолютно ВСЁ то, что в этих элементах упомянуто, делает функция session_start() автоматически?

  Ответить  
 
 автор: confirm   (13.04.2012 в 13:21)   письмо автору
 
   для: SilentChild   (13.04.2012 в 13:01)
 

Если вас интересует непосредственно код всего происходящего, то тогда обращайтесь к исходному коду РНР.
Не сливайте все в кучу, как то чтение cookie и т.п.. Неужто трудно понять, что браузер передает в заголовке идентификатор сессии, а это означает, что не надо ничего читать. Загляните во временную папку своего локального сервера, и вы увидите там файлы сессий. Имена их, это и есть их идентификаторы. Говоря простым языком - браузер клиента сообщает серверу, что нужно продолжать работу с файлом сессии, например, sess_6c036c39991d73e38d70c9c0f120c812.
Вот и вся загадка.
$SID = $_COOKIE['SID'];
...
$SID = session_id();
и прочее, это если вам необходимо самому установить/изменить идентификатор, при этом явно записывать его в cookie клиента нет необходимости, это делается автоматически.

  Ответить  
 
 автор: SilentChild   (13.04.2012 в 13:29)   письмо автору
 
   для: confirm   (13.04.2012 в 13:21)
 

Принцип работы сессий мне понятен. Да, интересует исходный код функции session_start(). Спасибо. А как вобще можно его "откопать" этот исходный код? Если у меня установлен PHP, можно как-нибудь из библиотек или откуда-то ещё "вытянуть" этот код? С трудом представляю, как вообще смотреть исходники программного обеспечения с открытым кодом. Дистрибутив, как и установленный PHP уже скомпилирован? Так же? Получается никак не посмотреть исходники? Нужно на каком-то ресурсе искать в сети? Не подскажете адресок где эти исходники "тусуются"?

  Ответить  
 
 автор: confirm   (13.04.2012 в 14:00)   письмо автору
 
   для: SilentChild   (13.04.2012 в 13:29)
 

На официальном сайте скачивайте исходники и изучайте.

  Ответить  
 
 автор: Sfinks   (16.04.2012 в 23:36)   письмо автору
 
   для: 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

  Ответить  
 
 автор: SilentChild   (19.04.2012 в 13:01)   письмо автору
 
   для: Sfinks   (16.04.2012 в 23:36)
 

Благодарю, Sfinks! Теперь ситуация стала более ясной. =)

  Ответить  
Rambler's Top100
вверх

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