Ñåññèè
Àâòîð: | Àðòåìüåâ Ñåðãåé Èãîðåâè÷ |
ICQ: | 438856621 |
email: | _spin_@bk.ru |
Îäíîé èç îñîáåííîñòåé ïðîòîêîëà HTTP ÿâëÿåòñÿ "îòñóòñòâèå ïàìÿòè". Ýòî îçíà÷àåò, ÷òî ñåðâåð "çàáûâàåò" ïîëüçîâàòåëÿ ñðàçó æå ïîñëå îêîí÷àíèÿ HTTP-ñåññèè (çàãðóçêè ñòðàíèöû). Äàæå åñëè ïðîñòî îáíîâèòü ðàíåå çàãðóæåííóþ ñòðàíèöó - ñåðâåð áóäåò ñ÷èòàòü, ÷òî ê íåìó îáðàòèëñÿ íîâûé ïîëüçîâàòåëü.
Äëÿ ñòàòè÷åñêîãî ñàéòà ýòî âïîëíå äîñòàòî÷íî, ò.ê. ñîäåðæèìîå ñòðàíèö íå ìåíÿåòñÿ è âñåì ïîëüçîâàòåëÿì ïîêàçûâàåòñÿ îäíî è òî æå.À âîò äëÿ äèíàìè÷åñêèõ ñàéòîâ äåëî îáñòîèò íàìíîãî õóæå - çäåñü ñåðâåð äîëæåí êàêèì-òî îáðàçîì îòëè÷àòü ïîëüçîâàòåëåé äðóã îò äðóãà è âûäàâàòü êàæäîìó èç íèõ íóæíûå äàííûå.
PHP ïðåäëàãàåò ðåøåíèå íà îñíîâå ñåññèé. Ñåññèÿ - ýòî íàáîð ïàðàìåòðîâ è çíà÷åíèé, îäíîçíà÷íî îïðåäåëÿþùèõ ïîëüçîâàòåëÿ. Êàæäàÿ ñåññèÿ îáëàäàåò ñîáñòâåííûì óíèêàëüíûì èäåíòèôèêàòîðîì, ïîýòîìó ïîëüçîâàòåëþ äîñòàòî÷íî ñîîáùèòü ñåðâåðó èäåíòèôèêàòîð ñâîåé ñåññèè è ñåðâåð "âñïîìíèò" âñå ïîäðîáíîñòè è èñòîðèþ çàïðîñîâ ïîëüçîâàòåëÿ.
Èäåíòèôèêàòîð ñåññèè àâòîìàè÷åñêè ñîõðàíÿåòñÿ â áðàóçåðå ïîëüçîâàòåëÿ â âèäå cookie, à åñëè áðàóçåð cookie íå ïîääåðæèâàåò - èäåíòèôèêàòîð äîáàâëÿåòñÿ àâòîìàòè÷åñêè ê àäðåñó ñòðàíèöû è âñåì ññûëêàì íà íåé. Ýòî çíà÷èò, ÷òî ïðè îáíîâëåíèè ñòðàíèöû áðàóçåð ñàì îòïðàâèò íà ñåðâåð èäåíòèôèêàòîð ñåññèè, íåçàâèñèìî îò äåéñòâèé ïîëüçîâàòåëÿ.
 çàâèñèìîñòè îò íàñòðîåê PHP ñåññèè ìîãóò ñîçäàâàòüñÿ ëèáî âðó÷íóþ, ëèáî àâòîìàòè÷åñêè ïðè ïåðâîì îáðàùåíèè ïîëüçîâàòåëÿ. Ó áîëüøèíñòâî ïðîâàéäåðîâ àâòîìàòè÷åñêîå ñîçäàíèå ñåññèé íå âêëþ÷åíî èç ñîîáðàæåíèé ïðîèçâîäèòåëüíîñòè è áåçîïàñíîñòè.
Äëÿ ñîçäàíèÿ íîâîé ñåññèè íåîáõîäèìî âûçâàòü ôóíêöèþ session_start() áåç ïàðàìåòðîâ, ïîñëå ýòîãî ñòàíåò äîñòóïåí ãëîáàëüíûé ìàññèâ $_SESSION è â cookies áðàóçåðà ïîëüçîâàòåëÿ ïîÿâèòñÿ ýëåìåíò PHPSESSID.
<?php session_start(); $_SESSION['sampleName'] = 'Èâàí Èâàíû÷'; echo $_SESSION['sampleName']; ?>
Ñåññèÿ èíèöèèðóåòñÿ îäèí ðàç, à âñå ïîâòîðíûå âûçîâû session_start() ïðèâîäÿò òîëüêî ê ïîÿâëåíèþ ïðåäóïðåæäåíèÿ "Ñåññèÿ óæå îòêðûòà, ïîâòîðíîå îòêðûòèå íå äîïóñêàåòñÿ.". Äëÿ ïðîâåðêè, áûëà ëè óæå âûçâàíà ôóíêöèÿ session_start() ñóùåñòâóåò ñïåöèàëüíàÿ ôóíêöèÿ session_id(). Ýòà ôóíêöèÿ âñåãäà âîçâðàùàåò ñòðîêó ñ èäåíòèôèêàòîðîì ñåññèè, íî åñëè ñåññèÿ åù¸ íå ñîçäàíà - ñòðîêà áóäåò ïóñòîé.
<?php // îòêðûâàåì ñåññèþ òîëüêî åñëè îíà åù¸ // íå áûëà îòêðûòà ðàíåå if(session_id() == '') session_start(); ?>
Ýòîò ïðè¸ì î÷åíü óäîáåí, êîãäà âàø ñêðèïò ïîäêëþ÷àåò äðóãèå ñêðèïòû, â êîòîðûõ òàê æå ìîæåò áûòü âûçâàíà session_start().
Äëÿ òîãî, ÷òîáû âàøè äàííûå ñîõðàíÿëèñü íà ñåðâåðå ïðè ïåðåõîäàõ ìåæäó ñòðàíèöàìè, äîñòàòî÷íî ïîìåñòèòü èõ â ãëîáàëüíûé ìàññèâ $_SESSION. Íàïðèìåð:
<?php // îòêðûâàåì ñåññèþ session_start(); // ïðîâåðÿåì íà íàëè÷èå èìåíè â URL-çàïðîñå if(isset($_GET['name'])) { // ïîëó÷àåì èìÿ $name = $_GET['name']; // è ñîõðàíÿåì åãî â ñåññèè $_SESSION['name'] = $name; echo 'Èìÿ èçâëå÷åíî èç GET-çàïðîñà' . "<br />\n"; } // èíà÷å - ïðîâåðÿåì íàëè÷èå èìåíè â ñåññèè elseif(isset($_SESSION['name'])) { // èçâëåêàåì èìÿ èç ñåññèè $name = $_SESSION['name']; echo 'Èìÿ èçâëå÷åíî èç äàííûõ ñåññèè' . "<br />\n"; } // èíà÷å - âûâîäèì ñîîáùåíèå îá îøèáêå. else { $name = 'íå îáíàðóæåíî'; echo 'Èìÿ íå îáíàðóæåíî' . "<br />\n"; } // âûâîäèì èìÿ echo 'Ìî¸ èìÿ: ' . $name; ?>
Ñîõðàíèòå ýòîò êîä â ôàéëå myname.php â êîðíåâîì êàòàëîãå ëîêàëüíîãî ñåðâåðà è ïåðåéäèòå ïî àäðåñó http://localhost/myname.php. Ñêðèïò âûâåäåò ñîîáùåíèå, ÷òî èìÿ íå îáíàðóæåíî.
Òåïåðü èçìåíèòå àäðåñ ñòðàíèöû, äîïèñàâ ê íåìó "?name=Ivan" è ïåðåéäèòå ïî íîâîìó àäðåñó. Ñêðèïò ñîîáùèò, ÷òî îáíàðóæèë èìÿ â GET-çàïðîñå, è ÷òî âàøå èìÿ -Ivan. À òåïåðü ñíîâà ïåðåéäèòå ïî ïåðâîìó àäðåñó (áåç ïàðàìåòðîâ). Ñêðèïò ñîîáùàåò, ÷òî èìÿ èçâëå÷åíî èç äàííûõ ñåññèè, è ÷òî âàøå èìÿ ïî ïðåæäíåìó Ivan,
Èíîãäà âîçíèêàþò ñèòóàöè, êîãäà íàäî çàíîâî ñãåíåðèðîâàòü èäåíòèôèêàòîð ñåññèè. Äëÿ ýòîãî ñëóæèò ôóíêöèÿ session_regenerate_id(). Âûçûâàòü å¸ íóæíî ïîñëå îòêðûòèÿ ñåññèè:
<?php if(session_id() == '') session_start(); else session_regenerate_id(); ?>
Ïîêàçàíûé ïðè¸ì èíîãäà èñïîëüçóåòñÿ ïðè çàùèòå ñàéòîâ îò àòàê, çàêëþ÷àþùèõñÿ â ïîäìåíå çëîóìûøëåííèêîì ñâîåãî èäåíòèôèêàòîðà ñåññèè íà èäåíòèôèêàòîð ïîëüçîâàòåëÿ ñ áîëåå âûñîêèìè ïðèâèëåãèÿìè. Ïîäîáðàòü ÷óæîé èäåíòèôèêàòîð ïðàêòè÷åñêè íåâîçìîæíî, à âîò óçíàòü (ïðîñëóøèâàÿ ñåòü ñíèôôåðîì èëè ïîëüçóÿñü òðîÿíàìè) - âîçìîæíî.
Ýëåìåíòû ñåññèè ìîãóò áûòü íå òîëüêî ïðîñòûõ òèïîâ, íî è ìàññèâàìè:
<?php ... $_SESSION['myWorkWeek'] = array(); ... $_SESSION['myWorkWeek']['monday'] = 'Ïîíåäåëüíèê'; $_SESSION['myWorkWeek']['tuesday'] = 'Âòîðíèê'; ... $_SESSION['myWorkWeek']['friday'] = 'Ïÿòíèöà'; echo 'Ìîè ðàáî÷èå äíè: ' . implode(', ', $_SESSION['myWorkWeek']); // âûâåäåò: // Ìîè ðàáî÷èå äíè: Ïîíåäåëüíèê, Âòîðíèê, ... ?>
Ñåññèþ ìîæíî çàêðûòü èëè óíè÷òîæèòü. Çàêðûòèå ñåññèè ïðîèñõîäèò ïðè âûçîâå ôóíêöèè session_write_close(). Ïðè ýòîì âñå èçìåíåíèÿ, ñäåëàííûå â ñåññèè, ñîõðàíÿþòñÿ â äèñêîâîì êåøå. Åñëè æå íåîáõîäèìî çàêðûòü ñåññèþ è óäàëèòü âñå å¸ äàííûå - íàäî âûçâàòü session_destroy() èëè session_unset(). Îòëè÷èå ìåæäó íèìè â òîì, ÷òî session_unset() ìîæåò èñïîëüçîâàòüñÿ â ñòàðîì êîäå, ãäå íåäîñòóïåí ãëîáàëüíûé ìàññèâ $_SESSION.
<?php ... // îñâîáîæäàåì âñå ïåðåìåííûå ñåññèè $_SESSION = array(); // ñòèðàåì cookie èäåíòèôèêàòîðà ñåññèè if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } // óíè÷òîæàåì ñåññèþ session_destroy(); ?>
Êàê âèäèòå, ðàáîòàòü ñ ñåññèÿìè äîñòàòî÷íî ïðîñòî. Òîëüêî íå íàäî çàáûâàòü, ÷òî îáú¸ì äàííûõ, ñîõðàíÿåìûõ â ñåññèè, â êîíöå êîíöîâ êîíå÷åí è íå íàäî ñîõðàíÿòü ëèøíåãî.