PHP сесии под скалпел. Как работят PHP сесиите отвътре

Както вече знаете, HTTP протоколът позволява на уеб приложенията да установяват „сесии“ – диалог между клиент и сървър, като състоянието на този диалог се запазва от заявка до заявка.

Езикът PHP, който е предимно език за уеб програмиране, предоставя възможност за използване на механизма на HTTP сесията, като поема повечето грижи при организирането и съхраняването на данните за сесиите. Нека ви напомня какво е необходимо, за да работи механизмът на HTTP сесията:

  • Сървърът трябва да генерира уникален номер на сесия.
  • Номерът на сесията трябва да бъде предаден на клиента (обикновено чрез бисквитки).
  • Сървърът трябва да може да записва данни за сесията във файлове или в база данни, така че да може да бъде възстановена, като знае номера на сесията, който клиентът изпраща на сървъра при последващи заявки (също чрез бисквитки).

Всъщност единственото действие, което трябва да се предприеме в PHP програма, за да могат зъбните колела на сесийния механизъм да започнат да се въртят, е да се извика една функция: session_start(). Тази функция прави всички необходими неща:

  • Проверява дали клиентът е изпратил номер на вече съществуваща сесия в Cookie или в параметрите на заявката. Ако клиентът изпрати номер на сесия, тогава данните за тази сесия се зареждат от място за постоянно съхранение (например файл) в паметта и стават достъпни за програмата чрез масива $_SESSION. Ако клиентът не е изпратил номер на сесия или такава не съществува на сървъра, се създава нова сесия с нов номер, като данните за нея са достъпни и чрез масива $_SESSION, който при нова сесия ще бъде празен. Новосъздаденият номер на сесия се поставя в полето за заглавка на отговора на сървъра Set-Cookie.
  • Осигурява съхранение на данни от сесията. След като PHP програмата обработи заявката, текущото състояние на масива $_SESSION се съхранява в постоянно място за съхранение, така че да бъде достъпно отново следващия път, когато клиентът го поиска.

Сега, след като знаем подробностите зад session_start(), можем да си поиграем с този механизъм. Примерът по-долу съхранява едно число в сесията, което се увеличава с едно с всяка клиентска заявка:

Когато за първи път посетите тази страница, сървърът ще изпрати на браузъра бисквитка с номера на сесията:

Комплект-бисквитка: PHPSESSID=4ftvca7jmmnm04q95r3sdsk6r6; път=/

И браузърът ще изпрати същия номер на сесия обратно на сървъра с всяка следваща заявка. Сега, ако изчистите бисквитките в браузъра си, на сървъра ще бъде създадена нова сесия с различен номер и отчитането в нашия тестов скрипт ще започне отначало.

По-реалистичен пример: потребителско влизане

Най-често сесиите се използват, когато потребител влезе в уебсайт. При влизане в сайта потребителят въвежда потребителско име и парола, които се проверяват от сървъра. Ако данните за влизане са правилни, тогава сървърът трябва да запомни данните на потребителя в сесията, за да не иска отново потребителско име и парола. В най-простия случай това ще бъде пример:

array("password" => "123", "title" => "Administrator",), "user" => array("password" => "qwe", "title" => "User",),) ; връщане isset($users[$login])? $users[$login]: нула; ) функция getCurrentUser() ( $user = isset($_SESSION["user"])? $_SESSION["user"]: null; върне $user; ) функция setCurrentUser($user) ( $_SESSION["user"] = $user;?>

Здравейте,!
Линк1 Линк2

ИзлезВсе още не сте посетили сайта. Въведете потребителско име и парола:
Влизам: Парола:

Тази програма изисква потребителско име и парола и можете да влезете с вашето логин потребител, qweили администратор, 123 . На влезлия потребител се показва поздрав. При влизане се показва съобщение, ако потребителското име или паролата са неправилни.

След като успеете да получите достъп до този „сайт“, можете да щракнете върху връзките (Link1, Link2), като същевременно оставате влязъл потребител.

Какви данни могат да се съхраняват в сесия?

По подразбиране PHP съхранява данните за сесията във временен файл като текст. Можете да проверите това, като погледнете директорията с временни PHP файлове. Тази директория е посочена в phpinfo() в раздела Environment, TEMP. В тази директория ще намерите файлове като sess_ 4ftvca7jmmnm04q95r3sdsk6r6, където 4ftvca7jmmnm04q95r3sdsk6r6 е номерът на сесията, предадена на бисквитката. Погледнете този файл: ако сте изпълнили първия пример по-горе, тогава файлът ще съдържа нещо подобно: „value|i:2;“. Този текст е сериализирано представяне на съдържанието на сесията, което съхранява само една променлива с число.

Всички стойности, които PHP програма поставя в сесия чрез масива $_SESSION, се преобразуват в текст при запазване на сесията и след това се записват във файл. Процесът на преобразуване на променливи стойности в текст се нарича "сериализация". По този начин можете да поставите всякакви данни, които PHP може да сериализира в сесия.

За щастие в PHP можете да сериализирате не само прости стойности като числа и низове, но и сложни структури като масиви и обекти:

"; print_r($_SESSION); echo ""; $_SESSION["testArray"] = array(1, 2, 3, "one", "two", "three", "child" => array(5, 6, 7),); $obj = new stdClass(); $obj->x = 1234; $_SESSION["testObject"] = $obj;

Този пример ще запише следните данни във файла на сесията:

TestArray|a:7:(i:0;i:1;i:1;i:2;i:2;i:3;i:3;s:3:"едно";i:4;s:3 :"две";i:5;s:5:"три";s:5:"дете";a:3:(i:0;i:5;i:1;i:6;i:2; i:7;))testObject|O:8:"stdClass":2:(s:1:"x";i:1234;s:1:"y";i:4567;)

Съхраняване на обекти в сесия

Както можете да видите, обектите могат да се съхраняват в сесия. Но в същото време трябва да запомните, че когато запазвате обекти в сесия, които по някакъв начин се отнасят до вашите „домашно направени“ класове или обекти, които са екземпляри на вашите класове, е необходимо декларацията на тези класове да бъде направена преди извикването на session_start( ). Тоест PHP трябва да знае класа, преди да бъде споменат при десериализиране на данни от сесията.

При записване на обекти има ситуации, когато стандартната сериализация на обект по някаква причина е неприемлива или напълно невъзможна. В такива случаи можете да приложите сериализация ръчно, като декларирате магическите методи __sleep() и __wakeup() в класа.

Между другото, сериализирането може да се извърши и „ръчно“ и не е необходимо да се записват/зареждат данни от сесията. Това може да е необходимо, когато някои данни в приложението трябва да бъдат запазени за използване по-късно или прехвърлени по мрежата. Функциите, които могат да бъдат полезни за сериализация/десериализация, са serialize(), unserialize(), json_encode(), json_decode().

Какво не може да се съхранява в сесия?

Една сесия не може да съхранява нищо, което не може да бъде сериализирано. Пример за такъв обект би бил всеки PHP ресурс. Ресурсите са мрежови връзки, манипулатори на отворени файлове, връзки към бази данни и някои други обекти. Ресурс в PHP е препратка към вътрешен обект в недрата на PHP, който не е директно достъпен от програмата, но който може да бъде манипулиран чрез извикване на различни PHP функции. Един вид „черна кутия“, чието съдържание не може и не трябва да бъде сериализирано.

Допълнителни функции

PHP дава възможност на разработчика да приложи свой собствен начин за съхраняване на данни от сесии, например в база данни. За да направите това, е необходимо да внедрите функции, които ще запазват и зареждат данни от сесията от постоянно място за съхранение. След това трябва да кажете на PHP за тези функции, като извикате функцията session_set_save_handler.

За ускоряване на процеса на запазване и зареждане на данни от сесията на силно натоварени сайтове може да се използва сървърът Memcached, който съхранява данни в паметта. Поддръжката на този метод за съхраняване на сесии е вградена в PHP и се конфигурира чрез конфигурационния файл php.ini.

Можете да зададете името на параметъра Cookie, чрез който се предава номерът на сесията, като посочите неговото име, продължителност на живота, домейн и други параметри.

Тези и много други опции за настройка на HTTP сесии в PHP са достъпни чрез функциите session_*.

//Изчистване на данните за сесията за текущия скрипт: $_SESSION = ; //Изтриване на бисквитката, съответстваща на id: @unset($_COOKIE); //изтриване на хранилище за сесия: session_destroy();

За да разберете защо е необходимо да разделите изтриването на сесия на 3 етапа, нека да разберем какво съществува къде и къде се запазва.

За по-голяма яснота, нека дефинираме всички места, където се съхраняват всички видове данни от сесии:

  1. Суперглобален масив $_SESSION.
    Създаден в началото на сесията session_start(). Това е само скриптова променлива, която е достъпна само докато скриптът работи и НЕ се съхранява в хранилището на сървъра, а се съхранява в RAM (което означава, че изчезва след следващото изпълнение на скрипта, като се инициализира отново от хранилището на следващия време на достъп до сървъра).

    От Котеров:

    Когато скриптът приключи, PHP автоматично записва масива $_SESSION във временно хранилище, чието име се съхранява в SID

    това означава, че данните от масива се записват в паметта $_SESSION, ако има такива в него.

  2. Гответе SID.
    Създаден в началото на сесията session_start(). Съхранява местоположението на хранилището на данни за сесията за даден потребител. Може да бъде изтрит само ако принудително изчистите бисквитките.
  3. И накрая, Съхраняване на данни от сесии.
    Създава се при стартиране на сесия чрез извикване на функцията session_start(). Хранилището се намира на сървъра (където работи вашият PHP скрипт).
    В него се записват данни от масива $_SESSION, ако са/се появяват там. Данните се изтриват от него само при извикване session_destroy().
    Това хранилище продължава да съществува на сървъра дори след като следващата заявка от потребителя е получила отговор, т.е. скриптът е свършил работата си.

Тези. можем да кажем, че:

  • В PHP скрипт можете да работите с данни от сесия чрез масива $_SESSION
  • $_SESSIONе "маска" за хранилището на сесията и въпреки че записването в този масив води до записване в хранилището, изтриването на масива само по себе си не унищожава данните в хранилището.
  • С изтриването на масива ще загубите достъп до данните за сесията само в текущото извикване на скрипта, но в следващото ще бъде реинициализирано (възкръсване от пепелта), ако не изчистите допълнително хранилището.

По този начин

Ако session_destroy()няма да бъдат извикани и бисквитките няма да бъдат изчистени, тогава, когато скриптът се стартира отново, данните от хранилището, които преди са били записани в него, ще се появят в $_SESSION, дори ако изпълнявате скрипта, ръчно в $_SESSIONняма да ги добавяш.

// Пишем този ред, за да изчистим данните от сесията в текущия скрипт $_SESSION = ; //Този ред премахва SID @unset($_COOKIE); //Изтрива хранилището на сесията: session_destroy();

От самото начало всички приеха PHP с гръм и трясък, но веднага щом започнаха да се създават доста големи проекти на този език, разработчиците бяха изправени пред нов проблем - на PHP липсваше концепцията за глобални променливи! Тоест определен скрипт беше изпълнен, изпрати генерираната страница на клиента и всички ресурси, използвани от този скрипт, бяха унищожени. Ще се опитам да илюстрирам: да предположим, че има две страници от един сайт, index.php и dothings.php. Източниците за тези страници изглеждат така:

index.php dothings.php

Ако стартираме тези два скрипта, тогава на първата страница ще видим надписа „Бях назначен на index.php“, а втората страница ще бъде празна.

Разработчиците на уебсайтове, без да се замислят, започнаха да използват бисквитки за съхраняване на глобални променливи от страна на клиента. Процесът изглеждаше така: потребителят идва на главната страница на сайта, извършва някои действия и цялата информация, свързана с този потребител, която може да е необходима на други страници на сайта, ще се съхранява в неговия браузър под формата от бисквитки. Този метод има доста сериозни недостатъци, поради които много разработчици наведнъж се отказаха от PHP. Например, трябва да упълномощим потребител, за да му разрешим достъп до частни (или частни) секции на сайта. Ще трябва да изпратите на потребителя бисквитка, която ще служи като негов последващ идентификатор в сайта. Този подход става много тромав и неудобен веднага щом сайтът започне да събира все повече и повече информация за поведението на потребителя, тъй като е препоръчително да кодирате цялата информация, изпратена до потребителя, така че да не може да бъде фалшифицирана. Съвсем наскоро, чрез подправяне на бисквитки, беше възможно да се „разбие“ повече от един чат, а понякога дори да се промъкне в пощата на някой друг. Освен това в света все още има странни хора, чийто браузър не поддържа бисквитки.

Няма да навлизам в технологичните проблеми на механизма на сесията, а само ще опиша как правилно да работите със сесии в PHP.

Как да работим със сесии?

Ако тествате примерите от статията (или вашите скриптове) на който и да е комерсиален хостинг, не би трябвало да има проблеми с работата със сесии. Ако сами настроите сървъра си (независимо дали е истински сървър или емулатор), може да се появят грешки с нещо подобно:

„Предупреждение: неуспешно отваряне(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR): Няма такъв файл или директория (2).“

Това просто означава, че вашият PHP е конфигуриран неправилно. Можете да разрешите този проблем, като посочите правилния път (до съществуваща директория) за запазване на сесии във файла php.ini и рестартирате сървъра.

Всеки скрипт, който ще използва променливи (данни) от сесии, трябва да съдържа следния ред:

Session_start();

Тази команда казва на сървъра, че дадена страница се нуждае от всички променливи, които са свързани с даден потребител (браузър). Сървърът взема тези променливи от файла и ги прави достъпни. Много е важно да отворите сесия, преди каквито и да било данни да бъдат изпратени на потребителя; на практика това означава, че е препоръчително функцията session_start() да се извиква в самото начало на страницата, например така:

Session_start(); ?> ... За да зададете директорията, в която ще се записват сесийните файлове, използвайте функцията session_save_path(): session_save_path($_SERVER["DOCUMENT_ROOT"]."/session"); session_start();

След като сесията започне, можете да зададете глобални променливи. При присвояване на стойност на което и да е поле от масива $_SESSION, променлива със същото име автоматично се регистрира като променлива на сесията. Този масив е наличен на всички страници, използващи сесията. Например, нека да разгледаме програмата:

index.php Всичко е наред. Сесията е заредена! Нека да минем и да видим какво има там:

dothings.php

Когато изпълнявате тези файлове последователно, първият скрипт "index.php" ще доведе до следния резултат:

Всичко е наред. Сесията е заредена! Нека да минем и да видим какво има там:

И второто „dothings.php“ е това:

Бях помолен да index.php

Променливата $a вече е достъпна на всички страници на даден сайт, които са стартирали сесии.

Други полезни функции и техники за работа със сесии:

  • деактивирано ($_SESSION["a"])- сесията „забравя” стойността на зададената променлива на сесията;
  • session_destroy()- сесията е унищожена (например, ако потребителят напусне системата, като щракне върху бутона „изход“);
  • session_set_cookie_params (int живот [, път на низ [, домейн на низ]])- с помощта на тази функция можете да зададете колко време ще "живее" сесията, като зададете unix_timestamp, който определя времето на "смъртта" на сесията. По подразбиране сесията е "на живо", докато клиентът затвори прозореца на браузъра.
  • session_write_close()- запис на променливи на сесията и нейното затваряне. Това е необходимо, за да отворите сайта в нов прозорец, ако обработката на страницата отнема много време и е блокирала файла на сесиите за вашия браузър.

Примери

Сега нека се обърнем към практическото приложение на сесийния механизъм. Тук ще разгледаме няколко доста прости и в същото време полезни примера.

Упълномощаване на потребителя

На конференции за уеб програмиране непрекъснато се задават въпроси относно оторизацията на потребителите с помощта на PHP сесии. Механизмът за оторизиране на потребители в системата чрез сесии е доста добър от гледна точка на сигурността (вижте раздела).

Нашият пример ще се състои от три файла: index.php, authorize.php и secretplace.php. Файлът index.php съдържа формуляр, където потребителят ще въведе своето потребителско име и парола. Този формуляр ще предаде данни към файла authorize.php, който, ако оторизацията е успешна, ще позволи на потребителя достъп до файла secretplace.php, а в противен случай ще покаже съобщение за грешка.

Примери: index.php Въведете паролата си

Влизам:
Парола:


authorize.php page... header("Местоположение: secretplace.php"); изход; ) ) // ако нещо не е наред, потребителят ще получи // съобщение за грешка. ?> Въвели сте грешна парола!

secretplace.php Здравейте,, ти си на секретна страница!!! :)

Безопасност

Така че можем да предадем идентификатор от една страница (PHP скрипт) на друга (до следващото извикване от нашия сайт), което означава, че можем да разграничим всички посетители на сайта. Тъй като идентификаторът на сесията е много голямо число (128 бита), практически няма шанс той да бъде намерен чрез груба сила. Следователно нападателят има следните възможности:

  • на компютъра на потребителя има троянски кон, който краде номера на сесии;
  • нападателят прихваща трафика между компютъра на потребителя и сървъра. Разбира се, има защитен (криптиран) SSL протокол, но не всеки го използва;
  • съсед се приближи до компютъра на нашия потребител и открадна номера на сесията.

Такива ситуации, базирани на факта, че някой е откраднал нещо от някой друг, по принцип не са от компетенциите на програмиста. Самите администратори и потребители трябва да се погрижат за това.

PHP обаче много често може да бъде "измамен". Нека да разгледаме възможните хакерски точки в програмата за оторизация на потребителя:

  • Файлът authorize.php е опит за отгатване на парола с помощта на скрипт на трета страна;
  • Файлът secretplace.php е опит за измама на програмата чрез въвеждане на стойностите на променливата $logged_user в адресната лента на браузъра, например така:
    "http://www.yoursite.ru/secretplace.php? logged_user=хакер"

И така, две „дупки“ са ясно видими в нашата програма, едната е малка и не особено забележима, но втората е просто огромна, през която повечето хакери влизат там, където не е нужно.

Как да „закърпим“ дупка номер 1?

Ние няма да пишем тонове код за блокиране на IP адрес и т.н., а просто проверяваме откъде идва заявката или по-скоро от коя страница е дошла заявката, ако е някоя страница от нашия сайт, тогава всичко е наред, но в всички останали случаи Няма да ви пуснем. Нека коригираме файла authorize.php:

authorize.php V2 page... header("Местоположение: secretplace.php"); изход; ) ) ) ?> Въвели сте грешна парола!


Как да се отървете от "дупка" номер 2?

Да приемем, че имате уебсайт, където всеки може да се регистрира, за да публикува във форум. Естествено във форума някои потребители (администратори, модератори) имат повече възможности от други, например могат да изтриват съобщения от други потребители. Вие съхранявате нивото на достъп на потребителя в сесията в променливата $user_status, където $user_status = 10 съответства на пълен достъп до системата. Нападателят, който влиза в сайта, просто трябва да се регистрира по нормалния начин и след това да добави в адресната лента на браузъра ?user_status=10. Така че имате нов администратор на вашия форум!

По принцип всяка променлива на скрипта може да бъде зададена чрез адресната лента, като просто добавите въпросителен знак и името на променливата с нейната стойност след пълния адрес на скрипта. Нека коригираме нашия код, за да избегнем това:

secretplace.php V2 променлива unset($_SESSION["logged_user"]); // отворете сесията session_start(); /* не можете просто да отидете на тази страница... ако потребителското име не е регистрирано, тогава ние го пренасочваме към страницата index.php, за да въведе своето потребителско име и парола... тук всъщност можете да правите много неща, например, запомнете IP адреса на потребителя и след третия опит за достъп до файлове го блокирайте. */ if(!isset($_SESSION["logged_user"]))( header("Местоположение: index.php"); изход; ) ?> Здравейте,, вие сте на секретна страница!

Резултати

Сесийният механизъм е доста добра характеристика на езика PHP. Сесиите са прости и много гъвкави за използване. Между другото, има една, малко документирана функция на PHP сесиите (достъпна от версия 4.0.3) - в сесиите можете да съхранявате не само променливи, но и обекти.

Примери

?>
// Автоматично вмъкване на SID във връзки. ini_set("session.use_trans_sid", true); session_start(); ?> Натисни тук!
Натисни тук!!



// Пример за работа със сесии. session_start(); // Ако току-що сте посетили сайта, нулирайте брояча. if (!isset($_SESSION["count"])) $_SESSION["count"] = 0; //Увеличете брояча в сесията. $_SESSION["брой"] = $_SESSION["брой"] + 1; ?>

Брояч

време(а).
Затворете браузъра си, за да нулирате брояча.
" target="_blank"> Отворете прозорец на дъщерен браузър.
// Прост пример за използване на сесии без бисквитки. session_name("тест"); session_start(); $_SESSION["брой"] = @$_SESSION["брой"] + 1; ?>

Брояч

Отворихте тази страница в текущата си сесия на браузъравреме(а).
Затворете браузъра си, за да нулирате този брояч.
?">Щракнете тук, за да опресните страницата!

Сесиите в PHP са механизъм за съхраняване на информация за компютъра на клиента от страната на сървъра. Всъщност сесиите в PHP не са толкова сложна тема, но за да я разберете, трябва да знаете как работят бисквитките в PHP. Така че, ако не знаете как работят бисквитките в PHP, първо прочетете съответната статия и след това се върнете тук.

Думата сесия се превежда от английски като сесия, така че самото значение на сесиите в PHP става по-ясно, но програмистите са възприели термина „сесии“ и ние ще го използваме в тази статия.

Сесиите в PHP са много подобни на механизма за бисквитки, същите двойки ключ => стойност, само че се съхраняват от страната на сървъра.

функция session_start().

Трябва да стартираме сесията, за това има функцията session_start(). Тази функция стартира сесия или сесия, както искате да я наречете.

Препоръчително е да извикате функцията session_start() в самото начало на страницата, но в моите примери аз не правя това.

$_SESSION масив

Сесиите са групи от променливи, които се съхраняват на сървъра, но се отнасят до един уникален посетител. Отново, това е ключовият момент: сесии се съхраняват на сървъра.

За да се гарантира, че всеки посетител взаимодейства с неговите данни от неговата сесия, се използва бисквитка, командата за създаване, която PHP си дава, не е нужно да се притеснявате за това. Тази бисквитка е подходяща само за сървъра и не може да се използва за получаване на потребителски данни.

На сървъра данните за сесията се съхраняват в текстов файл и са налични в PHP програмата в масива $_SESSION. За да запазите променлива в сесия, трябва да й присвоите стойност в този масив.

Нека най-накрая започнем да използваме примери. Всичко е много просто.

Сесии в PHP смисъл."; ?>

Сега нека се опитаме да получим стойността от масива $_SESSION в друг пример.

Сесии в PHP

Моля, обърнете внимание, че ако във втория пример премахнем функцията session_start(), тогава няма да имаме достъп до данните в масива $_SESSION.

функция session_id().

След като се създаде сесия, вие автоматично имате достъп до уникалния идентификатор на сесията с помощта на функцията session_id(). Тази функция ви позволява както да зададете, така и да получите стойността на ID на сесията.

Сесии в PHP

Можете да погледнете в лентата с инструменти за програмисти на вашия браузър (в Chrome натиснете Ctrl + Shift + I, след това Ресурси и там ще намерите бисквитка), този домейн е задал бисквитка за вашия браузър с името PHPSESSID и приблизително следното стойност: „7g5df9rkd1hhvr33lq1k6c72p7“.

По стойността на PHPSESSID сървърът ще определи вашия браузър и ще работи със съответния набор от променливи, които ще бъдат достъпни за скрипта чрез масива $_SESSION, както беше написано по-рано.

session_name() функция

Докато функцията session_id() ви позволява да получите стойността на ID на сесията, функцията session_name() ви позволява да получите името на сесията.

Сесии в PHP

Още веднъж за функцията session_start().

Сега знаем повече за това как работят сесиите в PHP и трябва да се върнем отново към функцията session_start(). Тази функция инициализира механизма на сесията за текущия потребител. Как точно става това:

  • Ако потребителят стартира сайта за първи път, session_start() задава бисквитка на клиента и създава временно хранилище на сървъра, свързано с потребителския идентификатор.
  • Указва магазина, свързан с текущия предадеен идентификатор.
  • Ако има данни в хранилището на сървъра, те се поставят в масива $_SESSION.
  • Ако register_globals от файла php.ini е On, тогава всички елементи на масива $_SESSION се превръщат в глобални променливи.

Пример за използване на сесия

Сега ще разгледаме пример, който ще ни позволи да проведем малки експерименти със сесии.

Сесии в PHP

Брояч

Отворихте страница в текущата сесияведнъж.

Отворете примера в ">този раздел.

Цялата работа на сесиите се основава на масива $_SESSION, това е ясно видимо в този пример.

Ако затворите прозореца на браузъра, сесията ще приключи и нашият брояч ще бъде нулиран. Това поведение на сесиите в PHP може да бъде променено; ще се върнем към този проблем малко по-късно в статията.

Прекратяване на сесия

За да завършим сесията ни трябва:

  1. Изчистете масива $_SESSION.
  2. Изтрийте временното хранилище на сървъра.
  3. Изтрийте сесийните бисквитки.

Можете да изчистите масива $_SESSION с помощта на функцията session_unset().

Функцията session_destroy() изтрива временното хранилище на сървъра. Между другото, тя не прави нищо друго.

Трябва да изтриете сесийна бисквитка с помощта на функцията setcookie(), която научихме в урока за работа с бисквитки в PHP.

Пример за прекратяване на сесия:

Прекратяване на сесия

Сесията приключи.

Сега можете да проведете експеримент: изпълнете пример с брояч в един прозорец, увеличете брояча и след това изпълнете примера с изтриване на сесията и обновете страницата с брояча отново.

Можете да изтриете файл с бисквитка по следния начин:

setcookie(session_name(), "", time() - 60*60*24*32, "/")

Още веднъж за функциите session_name() и session_id().

Функциите session_name() и session_id() рядко се използват на практика, но аз пиша за тях, защото статията трябва да разкрие самия механизъм на това как работят сесиите в PHP.

Можете да използвате тези функции, за да дефинирате свои собствени имена и идентификатори на сесии, но това не се препоръчва. Ако искате да ги зададете, напишете тези функции с аргументи преди функцията session_start(), както в примера по-долу:

Сесии в PHP

Използвайки този пример, на всички потребители ще бъде присвоен един и същ идентификатор на сесия.

Нека разгледаме по-отблизо тук: ако стартирате примера от раздела за функцията session_name() (ето връзката) в различни браузъри (например Chrome и Internet Explorer), тогава всеки браузър ще има свой собствен уникален идентификатор на сесия . Браузърите съхраняват бисквитки всеки в своя собствена папка, така че функцията session_start() ще позволи на всеки браузър да създаде свой собствен уникален идентификатор и съответно ще бъде създадено уникално хранилище за всеки браузър на сървъра. Следователно примерът за брояч (този) ще работи независимо във всеки браузър.

Ако зададете един и същ идентификатор на сесия за всички потребители, те ще работят с едно и също хранилище на сървъра. Ето пример за брояч, който ще брои посещения от различни браузъри:

100) ( session_unset(); session_destroy(); ) ?> Сесии в PHP

Гише No2

Отваряне на страницата в различни браузъриведнъж.

Отворете примера в ">този раздел.

Ако стартирате този пример, не е факт, че ще видите такъв там. Други посетители може вече да са променили стойностите в магазина за сесии на сървъра. Не знам кога сървърът изтрива хранилището в този случай, така че ако броячът надвиши 100, ще прекратя сесията.

Настройка на времето за изчакване

По подразбиране сесията е "на живо", докато посетителят затвори прозореца на браузъра. Това се дължи на факта, че функцията session_start() поставя такава бисквитка на клиента.

Продължителността на сесията може да бъде променена с помощта на функцията session_set_cookie_params(), ето нейния синтаксис.

session_set_cookie_params (int lifetime [, път на низ [, домейн на низ [, bool secure]]])

На практика е достатъчно да използвате само първия параметър (lifetime), тук записвате времето в секунди, което определя колко дълго сървърът трябва да помни състоянието на сесията след затваряне на браузъра.

Ефектът от функцията session_set_cookie_params() се прилага само за периода, в който скриптът се изпълнява.

Ето пример за използване на тази функция:

Сесии в PHP

Гише No3

Стойност на брояча:.

Отворете брояча в ">този раздел.

Навийте брояча и затворете браузъра, след 30 секунди отворете отново този пример. Вашата сесия ще бъде запазена.



Свързани публикации