Как занести сессию в куки

Иисус Воскрес Коллеги! :)

Хотелось бы проконсультироваться у вас, на уже избитую тему сессий в куках (PHP).

Как стартовать сессию - мне понятно. В принципе понятен способ извлечении array информации из "файла".
Не понятно мне как записывать сессию в куки, без создания файла.
Есть где то уже более менее готовые классы? - Яндекс искал - находит всякие коряво - дырявые коды.
Хочется как бы научиться уже на том что готово - и быть уверенным, что именно так и надо делать, а не то что предлагают в книгах. Тут на форуме прочёл темы - но все равно не понял.
Так же пытаюсь теперь понять суть функции http://php.net/manual/en/function.session-set-save-handler.php
Поделитесь опытом пожалуйста.

1 ответов


Вообще-то в Cookie никто не хранит данные сессии. Само по себе выражение некорректно звучит. Сессия и Cookie - это два разных типа хранилища данных. Но, в большинстве случаев, сессия связана с Cookie - в Cookie хранят (но это не единственный вариант, хотя и самый простой) идентификатор сессии.
Общий механизм следующий:
- Пользователь делает запрос на сайт.
- Серверная часть инициализирует сессию с определённым уникальным идентификатором.
- В ответ пользователю приходит страница и команда на установку Cookie, в котором хранится идентификатор сессии.

Дальше, при каждом запросе, проверяется:
1. Пришёл ли от пользователя идентификатор сессии в Cookie?
1.1. Если да (идентификатор пришёл), то проверяется наличие сессии на сервере.
1.1.1. Если сессия найдена, то у кода, обрабатывающего запрос пользователя, есть доступ к сессии и данным, которые в ней хранятся.
1.1.2. Если сессия не найдена, то инициализируется новая сессия и её идентификатор уходит вместе с ответом сервера в Cookie пользователю.
1.2. Если нет (идентификатор не пришёл), то смотри пункт 1.1.2. ;)

Ещё идентификатор сессии может храниться, как часть URL или параметр URL.
Для обеспечения безопасности, идентификатор сессии на сервере привязывается к другим персистентным данным пользователя (User Agent, IP адрес и т.п.).


Хранить сессию в куках - это сумашедшая идея. Мало того что куки отправлюятся пользователю каждый раз при отправке страницы, так ещё и возвращаются от пользователя при запросе любой картинки, страницы или аякс запроса.

Так же, вы должны ясно понимать роль кукисов и роль сессий. И видеть в них разницу.

В куках хранится минимум информации для того что бы верно идентифицировать пользователя.
В сессиях хранится нужная техническая информация, которую скорее всего пользователь не должен видеть. Т.е. это может быть пароль или дата последней авторизации.

Ну и конечно вам следует знать что кукисы ограничены 4 килобайтами.


Кукисы используют исключительно, для запоминания каких то данных там последняя просмотренная страница и так далее думаю идея понятна, а вот сессия служит для хранения данных о пользователях.


function setCookie(cookie){
...
}
 

function getCookie(cookie){
...
}
 
http://www.codenet.ru/webmast/js/Cookies.php

Найдите пример реализации в гугле и все, куки используют чаще в front-end'е.


<?php
session_start();//Старт сессии
$_SESSION['Имя'] = 'Значение'; //Русские имена не держит, меняем на английский
$_COKIE['Имя']=$_SESSION['Имя'];
?>
 

var Имя;  //Объявление переменной
Имя='Значени'; //Ввод в ручную
Имя=prompt(""); //Ввод куков пользователем
setCookie("Имя",Имя,365); //Сохранение куков

Имя=getCookie("Имя"); //Вывод куков
alert(Имя);
 

Также необходимы функции

function getCookie(c_name){...}
function setCookie(c_name,value,exdays){...}
 
Вот они тут
http://www.w3schools.com/js/js_cookies.asp

Я разобрался с сессиями в БД.
Вот черновик, может подскажет новичкам как делать "сессии в БД"
Это так сказать каркас, его ещё надо доделывать.


   <?PHP
            /*
            Author : http://www.tuxradar.com/practicalphp/10/3/7
            */

     
        mysql_connect("LOCALHOST", "LOGIN", "PASSWORD");
        mysql_select_db("YOUR_DB_NAME");
       
        function sess_open($sess_path, $sess_name) {
            return true;
        }
     
        function sess_close() {
            return true;
        }
     
        function sess_read($sess_id) {
            $result = mysql_query("SELECT Data FROM sessions WHERE SessionID = '$sess_id';");
            if (!mysql_num_rows($result)) {
                $CurrentTime = time();
                mysql_query("INSERT INTO sessions (SessionID, DateTouched) VALUES ('$sess_id', $CurrentTime);");
                return '';
            } else {
                $CurrentTime = time();
                extract(mysql_fetch_array($result), EXTR_PREFIX_ALL, 'sess');
                mysql_query("UPDATE sessions SET DateTouched = $CurrentTime WHERE SessionID = '$sess_id';");
                return $sess_Data;
            }
        }
     
        function sess_write($sess_id, $data) {
            $CurrentTime = time();
            mysql_query("UPDATE sessions SET Data = '$data', DateTouched = $CurrentTime WHERE SessionID = '$sess_id';");
            return true;
        }
     
        function sess_destroy($sess_id) {
            mysql_query("DELETE FROM sessions WHERE SessionID = '$sess_id';");
            return true;
        }
     
        function sess_gc($sess_maxlifetime) {
            $CurrentTime = time();
            mysql_query("DELETE FROM sessions WHERE DateTouched + $sess_maxlifetime < $CurrentTime;");
            return true;
        }
     
        session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
        session_start();
           
        $_SESSION['foo'] = "TEST TEXT 1";
        $_SESSION['baz'] = "TEST TEXT 2";
     
    ?>