Na čo slúžia relácie v php? Základy používania. Ešte raz o funkcii session_start().

  • 20.06.2020

Relácie predstavujú jednoduchý spôsob ukladania informácií pre jednotlivých používateľov s jedinečným ID relácie. Toto možno použiť na uloženie stavu medzi požiadavkami na stránku. ID relácie sa zvyčajne odosielajú do prehliadača prostredníctvom súboru cookie relácie a používajú sa na získanie dostupných údajov relácie. Neprítomnosť ID relácie alebo cookie relácie hovorí PHP, aby vytvorilo novú reláciu a vygenerovalo nové ID relácie.

Relácie využívajú jednoduchú technológiu. Keď je vytvorená relácia, PHP buď získa existujúcu reláciu pomocou odovzdaného ID (zvyčajne zo súboru cookie relácie), alebo ak nebolo nič odovzdané, vytvorí sa nová relácia. PHP naplní superglobálnu premennú $_SESSION informáciami o relácii po spustení relácie. Keď PHP skončí, automaticky serializuje obsah superglobálnej premennej $_SESSION a odošle ju na uloženie pomocou obsluhy relácie na zaznamenanie relácie.

PHP štandardne používa na ukladanie relácií interný handler súborov, ktorý je nastavený v premennej session.save_handler INI.

Tento handler ukladá údaje na serveri do adresára špecifikovaného v konfiguračnej direktíve session.save_path. Relácie je možné spustiť manuálne pomocou funkcie session_start()

. Ak je direktíva session.auto_start nastavená na 1 , relácia sa automaticky spustí na začiatku požiadavky..

Relácia sa zvyčajne ukončí, keď PHP dokončí vykonávanie skriptu, ale možno ju ukončiť aj manuálne pomocou funkcie

session_write_close()

POZOR:

Pozornosť Relácie je možné spustiť manuálne pomocou funkcie Komentujte Ak je direktíva session.auto_start nastavená na 1 , relácia sa automaticky spustí na začiatku požiadavky..

Relácie, ktoré používajú súbory (štandardne v PHP), uzamknú súbor relácie okamžite po otvorení relácie funkciou Ak je direktíva session.auto_start nastavená na 1 , relácia sa automaticky spustí na začiatku požiadavky. hneď po vykonaní všetkých požadovaných zmien v relácii, najlepšie bližšie k začiatku skriptu. Môžete tiež použiť iný mechanizmus relácie, ktorý podporuje súbežný prístup.

Relácie sú v skutočnosti veľmi jednoduché. Musíte len pochopiť, prečo sú potrebné a ako fungujú. Najprv si odpovedzme na prvú otázku.
Možno viete, že webový server neudržiava trvalé spojenie s klientom a každá požiadavka je spracovaná ako nová, bez spojenia s predchádzajúcimi.

To znamená, že nemôžete sledovať požiadavky od toho istého návštevníka ani pre neho ukladať premenné medzi zobrazeniami jednotlivých stránok. Práve na vyriešenie týchto dvoch problémov boli vynájdené relácie.
V skutočnosti sú relácie v skratke mechanizmus, ktorý vám umožňuje jednoznačne identifikovať prehliadač a na serveri vytvorí súbor pre tento prehliadač, v ktorom sú uložené premenné relácie.

Nebudem podrobne popisovať potrebu takéhoto mechanizmu. Ide o prípady ako nákupný košík v internetovom obchode, autorizáciu, ale aj nie úplne triviálne problémy, ako je ochrana interaktívnych častí stránky pred spamom.

V zásade je celkom jednoduché vytvoriť si vlastný analóg relácií, ktorý nie je taký funkčný ako ten, ktorý je zabudovaný do PHP, ale je v podstate podobný. Na základe cookies a databázy.

Pri vyžiadaní skriptu sa pozrieme, či neprišiel súbor cookie s konkrétnym názvom.

Ak neexistujú žiadne súbory cookie, nastavte ich a zapíšte do databázy nový riadok s používateľskými údajmi. Ak existujú súbory cookie, potom načítame údaje z databázy. Ďalšou požiadavkou vymažeme staré záznamy z databázy a teraz máme pripravený mechanizmus relácie. Nie je to vôbec ťažké. Existujú však určité nuansy, kvôli ktorým je vhodnejšie použiť vstavaný mechanizmus relácie.

Najprv musíte nejakým spôsobom identifikovať prehliadač. Ak to chcete urobiť, musíte mu dať jedinečný identifikátor a požiadať ho, aby ho odoslal pri každej žiadosti. Je mi trápne priznať, ale keď som sa prvýkrát dozvedel o reláciách, myslel som si, že ide o nejaký špeciálny mechanizmus, nejaký nový spôsob komunikácie medzi prehliadačom a serverom – „relácie“. Že identifikátor relácie sa prenáša nejakým špeciálnym spôsobom. Ale sklamanie bolo vážne...
Relácie využívajú štandardné, dobre známe metódy prenosu údajov. V skutočnosti jednoducho neexistujú žiadne iné.
Úlohou PHP je poslať ho prehliadaču, aby ho vrátil pri ďalšej požiadavke. Z už spomínanej sekcie FAQ je zrejmé, že premennú je možné odovzdať iba dvoma spôsobmi: v súboroch cookie alebo požiadavkou POST/GET.
PHP používa obe možnosti.

Sú za to zodpovedné dve nastavenia v php.ini:

session.use_cookies - ak sa rovná 1, potom PHP odovzdá identifikátor cookies, ak 0, tak nie.
session.use_trans_sid, ak sa rovná 1, PHP ho odošle, pridá ho k URL a formulárom, ak 0, tak nie.

Tieto a ďalšie parametre relácie môžete zmeniť rovnakým spôsobom ako ostatné nastavenia PHP – v súbore php.ini, ako aj pomocou príkazu ini_set() alebo v konfiguračných súboroch webového servera

Ak je povolená iba prvá, potom na začiatku relácie (každý hovor session_start()) sú pre klienta nastavené cookies. Prehliadač správne vráti tento súbor cookie s každou ďalšou požiadavkou a PHP má identifikátor relácie. Problémy začínajú, ak prehliadač nevracia súbory cookie. V tomto prípade PHP bez prijatia cookies s identifikátorom vždy spustí novú reláciu a mechanizmus nebude fungovať.

Ak je povolený iba druhý, súbory cookie sa nenastavujú. A to je to, čo sa stane, kvôli čomu sa v skutočnosti oplatí použiť vstavaný mechanizmus relácie. Potom, čo skript vykoná svoju prácu a stránka sa úplne vytvorí, PHP naskenuje celú stránku a pridá identifikátor relácie ku každému odkazu a ku každému formuláru. Vyzerá to asi takto:

Index

zmení na

Index

a do formulárov sa pridá skryté pole

Teoreticky môžete v našich domácich reláciách o súboroch cookie a databáze manuálne priradiť prenos ID všetkým odkazom - a potom budú naše vlastné relácie fungovať bez ohľadu na súbory cookie. Ale súhlasíte - je príjemnejšie, keď túto prácu robí niekto iný? ;-)

V predvolenom nastavení sú obe možnosti v najnovších verziách PHP povolené. Ako to zvláda PHP? Cook je vždy vystavený. A odkazy sa automaticky dopĺňajú iba vtedy, ak PHP nezistilo cookies s identifikátorom relácie. Keď používateľ navštívi stránku prvýkrát počas tejto relácie, nastavia sa súbory cookie a vytvoria sa odkazy. Pri ďalšej požiadavke, ak sú cookies podporované, PHP vidí cookies a prestane dopĺňať odkazy. Ak cookies nefungujú, PHP pokračuje v správnom pridávaní id do odkazov a relácia sa nestratí.
Používatelia, ktorí majú povolené súbory cookie, uvidia dlhý odkaz s ID iba raz.

Prenos ID je dokončený. Teraz už zostáva len spojiť dátový súbor s ním na strane servera. PHP to urobí za nás. Stačí napísať:

session_start();
$_SESSION [ "test" ]= "Ahoj svet!" ;

A PHP zapíše testovaciu premennú do súboru spojeného s touto reláciou.

Je tu veľmi dôležitá poznámka.

Pole $_SESSION- špeciálny.
V skutočnosti obsahuje premenné, ktoré chceme sprístupniť v rôznych skriptoch.
Ak chcete umiestniť premennú do relácie, stačí ju priradiť k prvku poľa $_SESSION.
Ak chcete získať jeho hodnotu, stačí vstúpiť do rovnakého prvku. Príklad bude uvedený nižšie.

PHP zvláda aj garbage collection – odstraňovanie zastaraných súborov. Rovnako ako kódovanie dát a kopa ďalších potrebných vecí. V dôsledku tejto starostlivosti je práca s reláciami veľmi jednoduchá.
Tu sa vlastne dostávame k príkladu, ako fungujú relácie.
Veľmi malý príklad:

session_start();

ozvena "Aktualizovali ste túto stránku". $_SESSION["counter"]++. "raz.";
ozvena"
aktualizovať";
?>

Skontrolujeme, či máme v relácii premennú počítadla, ak nie, vytvoríme ju s hodnotou 0 a potom zobrazíme jej hodnotu a zvýšime ju o jednotku. Zvýšená hodnota sa zapíše do relácie a pri ďalšom volaní skriptu bude mať premenná hodnotu 1 atď. Je to veľmi jednoduché.

Aby ste mali prístup k premenným relácie na ktorejkoľvek stránke webu, musíte napísať LEN JEDEN (!) riadok na úplný začiatok KAŽDÉHO súboru, v ktorom potrebujeme relácie:

session_start();

session_start();
ak ($_SESSION [ "autorizované" ]<> 1 ) {
header("Umiestnenie: /auth.php" );
VÝCHOD;
}

Odstránenie premenných z relácie. Ak máte register_globals=off , tak stačí napísať

unset($_SESSION [ "var" ]);

Ak nie, tak blízko s ním treba napísať:

session_unregister("var");

Je veľmi dôležité pochopiť, na čo by sa relácie mali používať a na čo by sa nemali používať.

Po prvé, pamätajte na to, že relácie možno použiť iba vtedy, keď ich používateľ potrebuje, a nie na to, aby mu to bránilo. Identifikátora sa totiž môže kedykoľvek zbaviť!
Povedzme, že pri kontrole, či osoba vypĺňa formulár a nie skript, má samotný používateľ záujem na tom, aby relácia fungovala - inak nebude môcť formulár odoslať! Ale relácia už nie je vhodná na obmedzenie počtu požiadaviek na skript - škodlivý skript jednoducho nevráti identifikátor.

Po druhé. Je dôležité jasne pochopiť skutočnosť, že relácia je reláciou práce so stránkou, ako ju chápe človek. Prišiel som, pracoval, zavrel prehliadač - relácia sa skončila. Ako filmová relácia. Ak chcete vidieť ďalší, kúpte si nový lístok. Začnite novú reláciu. Existuje na to aj technické vysvetlenie. Mechanizmus relácie bude zaručene fungovať len do zatvorenia prehliadača. Cookies totiž nemusia klientovi fungovať a v tomto prípade po jeho zatvorení prirodzene všetky odkazy doplnené o identifikátor zmiznú.

Je pravda, že relácia môže zmiznúť bez zatvorenia prehliadača. Vzhľadom na obmedzenia uvedené v tomto článku mechanizmus relácie nedokáže určiť okamih, kedy používateľ zatvoril prehliadač. Na tento účel sa používa časový limit - vopred stanovený čas, po ktorom sa domnievame, že používateľ opustil stránku. Štandardne je toto nastavenie 24 minút.

Ak chcete ukladať informácie o používateľovi na dlhšiu dobu, použite súbory cookie a v prípade potreby databázu na serveri. Presne takto fungujú všetky populárne autorizačné systémy:

Po identifikácii užívateľa sa spustí relácia a v nej sa prenesie znak oprávnenia.
- Ak si potrebujete „zapamätať“ používateľa, na jeho identifikáciu sa nastaví súbor cookie.
- Keď používateľ nabudúce navštívi stránku, aby sa mohol prihlásiť, musí buď zadať heslo, alebo ho systém sám rozpozná pomocou predtým nastavených súborov cookie a relácia sa spustí. Nová relácia namiesto pokračovania v starej.

Po tretie, nemali by ste začínať relácie bez rozdielu pre každého, kto vstupuje na stránku. Vznikne tak úplne zbytočná záťaž. Nepoužívajte relácie na maličkosti – napríklad v pultoch. To, čo spylog nazýva relácie, sa samozrejme počíta na základe štatistík prihlásenia a nepoužíva sa mechanizmus relácie podobný PHP.

Okrem toho si zoberme vyhľadávač, ktorý indexuje vašu stránku. Ak vyhľadávací robot nepodporuje súbory cookie, PHP štandardne dodá odkazom PHPSESSID, čo nemusí byť veľmi príjemné pre vyhľadávač, ktorý podľa klebiet aj tak neuprednostňuje dynamické odkazy, ale tu všeobecne - a nová adresa pri každej návšteve!

Ak sa relácie používajú na obmedzenie prístupu k uzavretej časti webu, potom je všetko len vyhľadávač a nemal by to indexovať. Ak musíte rovnakú stránku zobraziť autorizovaným aj neoprávneným používateľom, potom vám pomôže tento trik - spustite reláciu len pre tých, ktorí zadali heslo, alebo pre tých, ktorí už reláciu začali.

Ak to chcete urobiť, prejdite na začiatok každej stránky namiesto len session_start() píšeme:

if (isset($_REQUEST [ názov_relácie ()])) začiatok_relácie ();

teda reláciu začneme len pre tých, ktorí poslali identifikátor.
Preto musí byť používateľovi odoslaný prvýkrát – v čase autorizácie.

Ak je meno a identita v poriadku, píšeme session_start() !

Najbežnejšie chyby, ktoré PHP vytvára pri pokuse o prácu s reláciami, sú nasledovné:
Dvaja z nich

Upozornenie: Nie je možné odoslať súbor cookie relácie – hlavičky už boli odoslané
Upozornenie: Nie je možné odoslať obmedzovač vyrovnávacej pamäte relácie – hlavičky už boli odoslané

spôsobené rovnakým dôvodom, riešenie je popísané v tomto vlákne

Upozornenie: open(/tmp\sess_SID, O_RDWR) zlyhalo: Žiadny takýto súbor alebo adresár (2) v full_script_path na riadku číslo

Predtým vyzerala

Upozornenie: Nepodarilo sa zapísať údaje relácie (súbory). Skontrolujte, či je aktuálne nastavenie session.save_path správne (/tmp) ,

ak je preložený z angličtiny, vysvetľuje to problém podrobne: cesta k adresáru špecifikovanému v php.ini, kde sa píšu súbory relácie, nie je dostupná. Túto chybu je najjednoduchšie opraviť. Stačí zaregistrovať adresár, ktorý existuje a je možné do neho zapisovať, napr.

session.save_path = c:\windows\temp

A potom nezabudnite reštartovať Apache.

Ako sa ukazuje, ľudská inteligencia nemá hraníc, a preto som nútený vysvetliť:
správa o tretej chybe (adresár sa nedá nájsť) NEVYHNUTNE povedie k objaveniu sa prvých dvoch, pretože chybové hlásenie sa vypíše do prehliadača a hlavičky sa potom nedajú použiť. Preto sa neponáhľajte hľadať predčasný záver, ale najprv si zapíšte správnu cestu!

Ďalším najčastejším problémom pri práci s reláciami je ťažké dedičstvo register_globals. NEDÁVAJTE názvy premenných skriptu, ktoré sa zhodujú s indexmi poľa $_SESSION!

S register_globals=on sa hodnoty navzájom prepíšu a budete zmätení.

Ak to nefunguje, ale nezobrazujú sa žiadne správy, pridajte dva riadky na úplný začiatok skriptu zodpovedného za zobrazenie VŠETKÝCH chýb na obrazovke - je celkom možné, že existujú chyby, ale jednoducho ich nevidíte.

ini_set("display_errors" , 1);
error_reporting(E_ALL);

alebo si pozrite chyby v error_log. Vo všeobecnosti téma zobrazovania chybových hlásení presahuje rámec tohto článku, takže sa uistite, že ich aspoň vidíte.

V tejto časti si môžete prečítať trochu viac o hľadaní chýb. Ak ste si istí, že neexistujú žiadne chyby, ale uvedený príklad aj tak nefunguje, potom možno PHP neumožňuje odovzdanie id cez URL,.
a súbory cookie z nejakého dôvodu nefungujú

Pozrite sa, čo sa deje s vašimi súbormi cookie.

session_start();
Vo všeobecnosti, ak vaše relácie nefungujú, skúste najskôr zadať identifikátor relácie manuálne, to znamená, že vytvorte odkaz a priraďte mu identifikátor:
ozvena "Aktualizovali ste túto stránku" if (!isset($_SESSION [ "počítadlo" ])) $_SESSION [ "počítadlo" ]= 0 ;

aktualizovať";
?>

. $_SESSION["counter"]++. "raz.

V tomto prípade by ste sa mali uistiť, že direktíva session.use_only_cookies nie je povolená, čo bráni PHP akceptovať identifikátor relácie, ak bol odovzdaný cez URL Ak tento príklad nefunguje, potom je problém buď v triviálnom preklepy $_SESSION(polovica „problémov“ s reláciami pochádza z nesprávne napísaného názvu premennej), alebo v príliš starej verzii PHP: podpora relácií sa objavila vo verzii 4.0 a pole - v 4.1 (predtým sa používal).

$ HTTP_SESSION_VARS

Ak to funguje, problém je v súboroch cookie. Sledujte, aké súbory cookie server nastavuje prehliadaču a či ich prehliadač vracia. Je veľmi užitočné vyhľadávať pohľadom na výmenu hlavičiek HTTP medzi prehliadačom a serverom.
Vysvetlenie fungovania cookies presahuje rámec tohto už aj tak príliš dlhého textu, ale aspoň sa uistite, že server odosiela cookies s identifikátorom a prehliadač ich vracia. A zároveň sa identifikátory navzájom zhodujú =)

Nastavenie cookies by malo vyzerať takto

Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6;

Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6;
cesta=/

(ak požadujete skript nie z koreňového adresára)

Odpoveď servera by mala vyzerať takto

Súbor cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6

Súbor cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6;

b = b
ak prehliadač vráti súbory cookie iné ako ID relácie.
, ale nerobí to pre hlavičky, JavaScript, metaznačky.

Preto musíte identifikátor pridať ručne, napríklad takto:

header("Umiestnenie: /script.php?" . názov_relácie(). "=" . id_relácie());

Veľmi zriedkavým problémom a nie je úplne jasné, odkiaľ pochádza, je, že nastavenie session.save_handler má inú hodnotu ako súbory.

  • Ak to tak nie je, opravte to.
    Okrem súborov cookie mechanizmus relácie odosiela aj hlavičky, ktoré zakazujú ukladanie stránok do vyrovnávacej pamäte (rovnaký obmedzovač vyrovnávacej pamäte). Pre html je to správne a potrebné. Keď sa však pokúsite odoslať súbor pomocou skriptu, ktorý kontroluje autorizáciu, Internet Explorer ho odmietne stiahnuť. Je to kvôli tomuto titulu. Zavolajte
    session_cache_limiter("súkromné");
  • musí vyriešiť problém pred začatím relácie. $_SESSION Aj keď sa to môže zdať divné, ale v poli Nemôžete použiť číselné indexy -$_SESSION [ 1 ], $_SESSION [ "10" ]
  • - relácie nebudú fungovať. Niekde medzi verziami 4.2 a 5.0 nebolo možné nastaviť session.use_trans_sid pomocou ini_set()
  • . Od verzie 5.0 je to už opäť možné. Pred verziou 4.3.3 súbory cookie PHP odosielalo súbory cookie iba vtedy, ak pri spustení relácie nebol v požiadavke žiadny identifikátor. Teraz sa súbory cookie odosielajú pri každom hovore

    session_start

Ak máte ďalšie otázky alebo vám niečo nie je jasné, vitajte u nás
Web server neudržiava trvalé spojenie s klientom a každá požiadavka je spracovaná ako nová, bez akéhokoľvek prepojenia s predchádzajúcimi.
To znamená, že nemôžete sledovať požiadavky od toho istého návštevníka ani pre neho ukladať premenné medzi zobrazeniami jednotlivých stránok. Práve na vyriešenie týchto dvoch problémov boli vynájdené relácie.

V skutočnosti sú relácie v skratke mechanizmus, ktorý vám umožňuje jednoznačne identifikovať prehliadač a na serveri vytvorí súbor pre tento prehliadač, v ktorom sú uložené premenné relácie.

Nebudem podrobne popisovať potrebu takéhoto mechanizmu. Ide o učebnicové prípady ako nákupný košík v e-shope, autorizáciu, ale aj nie úplne triviálne problémy, ako je ochrana interaktívnych častí stránky pred spamom.
Pri vyžiadaní skriptu sa pozrieme, či bol prijatý súbor cookie s konkrétnym názvom. Ak neexistuje žiadny súbor cookie, nastavte ho a zapíšte do databázy nový riadok s používateľskými údajmi. Ak existuje súbor cookie, potom načítame údaje z databázy. Ďalšou požiadavkou vymažeme staré záznamy z databázy a teraz máme pripravený mechanizmus relácie. Nie je to vôbec ťažké. Existujú však určité nuansy, kvôli ktorým je vhodnejšie použiť vstavaný mechanizmus relácie.

Ak je povolená iba prvá, potom na začiatku relácie (každý hovor session_start()) je pre klienta nastavený súbor cookie. Prehliadač správne vráti tento súbor cookie s každou ďalšou požiadavkou a PHP má identifikátor relácie. Problémy začínajú, ak prehliadač nevracia súbory cookie. V tomto prípade PHP bez prijatia cookie s identifikátorom vždy spustí novú reláciu a mechanizmus nebude fungovať.

Ak je povolený iba druhý, súbor cookie sa nenastaví. A to je to, čo sa stane, kvôli čomu sa v skutočnosti oplatí použiť vstavaný mechanizmus relácie. Potom, čo skript vykoná svoju prácu a stránka sa úplne vytvorí, PHP naskenuje celú stránku a pridá identifikátor relácie ku každému odkazu a ku každému formuláru. Vyzerá to asi takto:
Index zmení na
Index
a do formulárov sa pridá skryté pole

A prehliadač, keď kliknete na akýkoľvek odkaz, alebo keď kliknete na tlačidlo vo formulári, odošle v požiadavke premennú, ktorú potrebujeme - identifikátor relácie!
Z pochopiteľných dôvodov sa identifikátor pridáva iba k relatívnym odkazom.

Teoreticky môžeme v našich domácich reláciách o súboroch cookie a databáze manuálne priradiť prenos ID všetkým odkazom – a potom budú naše vlastné relácie fungovať bez ohľadu na súbory cookie. Ale súhlasíte - je príjemnejšie, keď túto prácu robí niekto iný? ;-)

V predvolenom nastavení sú obe možnosti v najnovších verziách PHP povolené. Ako to zvláda PHP? Cook je vždy vystavený. A odkazy sa automaticky dopĺňajú iba vtedy, ak PHP nezistilo cookie s identifikátorom relácie. Keď používateľ navštívi stránku prvýkrát počas tejto relácie, uloží sa súbor cookie a odkazy sa dokončia. Pri ďalšej požiadavke, ak sú súbory cookie podporované, PHP súbor cookie uvidí a prestane dopĺňať odkazy. Ak cookies nefungujú, PHP pokračuje v správnom pridávaní id do odkazov a relácia sa nestratí.
Používatelia s povolenými súbormi cookie uvidia dlhý odkaz s ID iba raz.

Fuj. Prenos ID je dokončený.
Teraz už zostáva len spojiť dátový súbor s ním na strane servera.
PHP to urobí za nás. Stačí len písať
session_start();
$_SESSION [ "test" ]= "Ahoj svet!" ;

A PHP zapíše testovaciu premennú do súboru spojeného s touto reláciou.
Je tu veľmi dôležitá poznámka.
Pole $_SESSION- špeciálny.
V skutočnosti obsahuje premenné, ktoré chceme sprístupniť v rôznych skriptoch.
Ak chcete umiestniť premennú do relácie, stačí ju priradiť k prvku poľa $_SESSION.
Ak chcete získať jeho hodnotu, stačí vstúpiť do rovnakého prvku. Príklad bude uvedený nižšie.

PHP zvláda aj garbage collection – odstraňovanie zastaraných súborov. Rovnako ako kódovanie dát a kopa ďalších potrebných vecí. V dôsledku tejto starostlivosti je práca s reláciami veľmi jednoduchá.
Tu sa vlastne dostávame k príkladu, ako fungujú relácie.
Veľmi malý príklad:
session_start();

ozvena "Aktualizovali ste túto stránku". $_SESSION["counter"]++. "raz.";
ozvena"
aktualizovať";
?>
Skontrolujeme, či máme v relácii premennú počítadla, ak nie, vytvoríme ju s hodnotou 0 a potom zobrazíme jej hodnotu a zvýšime ju o jednotku. Zvýšená hodnota sa zapíše do relácie a pri ďalšom volaní skriptu bude mať premenná hodnotu 1 atď.
Je to veľmi jednoduché.

Aby ste mali prístup k premenným relácie na ktorejkoľvek stránke lokality, musíte napísať LEN JEDEN (!) riadok na úplný začiatok KAŽDÉHO súboru, v ktorom potrebujeme relácie:
session_start();
A potom pristupujte k prvkom poľa $_SESSION. Napríklad kontrola autorizácie by vyzerala takto:
session_start();
ak ($_SESSION [ "autorizované" ]<> 1 ) {
header("Umiestnenie: /auth.php" );
VÝCHOD;
}

Odstránenie premenných z relácie.
Ak máte register_globals=off , tak stačí napísať
unset($_SESSION [ "var" ]);
Ak nie, tak blízko Potrebujem si s ňou písať
session_unregister("var");

Najbežnejšie chyby, ktoré PHP vytvára pri pokuse o prácu s reláciami, sú nasledovné:
Dvaja z nich
Upozornenie: Nie je možné odoslať súbor cookie relácie – hlavičky už boli odoslané
Upozornenie: Nie je možné odoslať obmedzovač vyrovnávacej pamäte relácie – hlavičky už boli odoslané

spôsobené rovnakým dôvodom, riešenie je popísané v tomto vlákne
po tretie,
Upozornenie: open(/tmp\sess_SID, O_RDWR) zlyhalo: Žiadny takýto súbor alebo adresár (2) v full_script_path na riadku číslo(predtým vyzerala Upozornenie: Nepodarilo sa zapísať údaje relácie (súbory). Skontrolujte, či je aktuálne nastavenie session.save_path správne (/tmp)),
ak je preložený z angličtiny, vysvetľuje to problém podrobne: cesta k adresáru špecifikovanému v php.ini, kde sa píšu súbory relácie, nie je dostupná. Túto chybu je najjednoduchšie opraviť. Stačí zaregistrovať adresár, ktorý existuje a je možné do neho zapisovať, napr.
session.save_path = c:\windows\temp
A potom nezabudnite reštartovať Apache.

Ako sa ukazuje, ľudská inteligencia nemá hraníc, a preto som nútený vysvetliť:
správa o tretej chybe (adresár sa nedá nájsť) NEVYHNUTNE povedie k objaveniu sa prvých dvoch, pretože chybové hlásenie sa vypíše do prehliadača a hlavičky sa potom nedajú použiť. Preto sa neponáhľajte hľadať predčasný záver, ale najprv si zapíšte správnu cestu!

Ďalším najčastejším problémom pri práci s reláciami je ťažké dedičstvo register_globals. NEDÁVAJTE názvy premenných skriptu, ktoré sa zhodujú s indexmi poľa $_SESSION!
S register_globals=on sa hodnoty navzájom prepíšu a budete zmätení.
A s hodnotou register_globals=off sa zobrazí ďalšia chyba: „Váš skript sa možno spolieha na vedľajší efekt relácie, ktorý existoval až do PHP 4.2.3.“, ak má skript premennú relácie, ktorá nemá žiadnu hodnotu, a globálnu premennú s rovnaké meno. Aby ste sa toho zbavili, musíte premenné pred použitím vždy inicializovať (alebo aspoň skontrolovať ich existenciu) a nedávať globálnym premenným názvy, ktoré sa zhodujú s indexmi poľa $_SESSION.

Ak to nefunguje, ale nezobrazujú sa žiadne správy, pridajte dva riadky na úplný začiatok skriptu zodpovedného za zobrazenie VŠETKÝCH chýb na obrazovke - je celkom možné, že existujú chyby, ale jednoducho ich nevidíte.
ini_set("display_errors" , 1);
error_reporting(E_ALL);

alebo si pozrite chyby v error_log. Vo všeobecnosti téma zobrazovania chybových hlásení presahuje rámec tohto článku, takže sa uistite, že ich aspoň vidíte. V tejto časti si môžete prečítať trochu viac o hľadaní chýb.

Ak ste si istí, že neexistujú žiadne chyby, ale uvedený príklad aj tak nefunguje, potom možno PHP neumožňuje odovzdanie id cez URL, a súbory cookie z nejakého dôvodu nefungujú.
Pozrite sa, čo je zlé s vašimi cookies.
Vo všeobecnosti, ak vaše relácie nefungujú, skúste najskôr odovzdať identifikátor relácie manuálne, to znamená, že vytvorte odkaz a priraďte mu identifikátor:
session_start();
if (!isset($_SESSION [ "počítadlo" ])) $_SESSION [ "počítadlo" ]= 0 ;
ozvena "Aktualizovali ste túto stránku" if (!isset($_SESSION [ "počítadlo" ])) $_SESSION [ "počítadlo" ]= 0 ;

aktualizovať";
?>

Mali by ste sa však uistiť, že direktíva session.use_only_cookies nie je povolená, čo bráni PHP akceptovať ID relácie, ak bolo odovzdané cez URL

Ak tento príklad nefunguje, potom je problém buď v triviálnom Ak tento príklad nefunguje, potom je problém buď v triviálnom(polovica „problémov“ s reláciami pochádza z nesprávne napísaného názvu premennej), alebo v príliš starej verzii PHP: podpora relácií sa objavila vo verzii 4.0 a pole $_SESSION(polovica „problémov“ s reláciami pochádza z nesprávne napísaného názvu premennej), alebo v príliš starej verzii PHP: podpora relácií sa objavila vo verzii 4.0 a pole - v 4.1 (predtým sa používal).
Ak to funguje, problém je v súboroch cookie. Sledujte, aký druh cookie server nastaví prehliadaču a či ho prehliadač vráti. Je veľmi užitočné vyhľadávať pohľadom na výmenu hlavičiek HTTP medzi prehliadačom a serverom.
Vysvetlenie, ako fungujú cookies, presahuje rámec tohto už príliš dlhého textu, ale aspoň sa uistite, že server odošle súbor cookie s identifikátorom a prehliadač ho vráti. A zároveň sa identifikátory navzájom zhodujú =)
Nastavenie súboru cookie by malo vyzerať takto
Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6;
alebo ako
Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; cesta=/
(ak požadujete skript nie z koreňového adresára)
Odpoveď servera by mala vyzerať takto
Súbor cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6
alebo
Súbor cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; b = b
ak prehliadač vráti súbory cookie iné ako ID relácie.

Ak prehliadač nevracia súbory cookie, skontrolujte, či súbory cookie vôbec fungujú.
Uistite sa, že doména, ku ktorej pristupujete, má normálny názov (aspoň s jednou bodkou a bez nepovolených znakov, ako sú podčiarkovníky) a vymažte vyrovnávaciu pamäť prehliadača – to sú dva hlavné dôvody, prečo súbory cookie nemusia fungovať.

Ak príklad odtiaľto funguje, ale váš vlastný kód nie, potom problém zjavne nie je v reláciách, ale v algoritme. Vyhľadajte, kde ste stratili premennú, preneste príklad odtiaľto krok za krokom, odlaďte svoj skript.

Ďalší problém môže nastať, ak použijete presmerovanie hlavičky alebo JavaScript navigáciu.
Faktom je, že PHP automaticky pripája identifikátor relácie iba k odkazom ako
, ale nerobí to pre hlavičky, JavaScript, metaznačky.
Preto musíte identifikátor pridať ručne, napríklad takto:
header("Umiestnenie: /script.php?" . názov_relácie(). "=" . id_relácie());

Veľmi zriedkavým problémom a nie je úplne jasné, odkiaľ pochádza, je, že nastavenie session.save_handler má inú hodnotu ako súbory. Ak to tak nie je, opravte to.

Bezpečnosť
Bezpečnosť relácie je široká téma. Preto sa zameriam na niekoľko hlavných bodov.
Najučebnicovejšia je neprehadzovať identifikátor cez adresný riadok. Toto je napísané aj v php.ini, ale to obmedzuje funkčnosť relácií. Ak sa rozhodnete postupovať podľa tejto rady, potom okrem session.use_trans_sid = 0 nezabudnite na session.use_only_cookies = 1
Odporúča sa spojiť reláciu s IP adresou: týmto spôsobom, ak je identifikátor odcudzený, darebák ho vo väčšine prípadov stále nebude môcť použiť.
Odporúča sa použiť direktívu session.save_path, ktorá vám umožňuje nastaviť si vlastný adresár na ukladanie súborov relácie. Je to bezpečnejšie ako ich uloženie v predvolenom zdieľanom dočasnom adresári servera.

Ďalšie informácie:

  • Okrem súborov cookie mechanizmus relácie odosiela aj hlavičky, ktoré zakazujú ukladanie stránok do vyrovnávacej pamäte (rovnaký obmedzovač vyrovnávacej pamäte). Pre html je to správne a potrebné. Keď sa však pokúsite odoslať súbor pomocou skriptu, ktorý kontroluje autorizáciu, Internet Explorer ho odmietne stiahnuť. Je to kvôli tomuto titulu. Zavolajte
    Okrem súborov cookie mechanizmus relácie odosiela aj hlavičky, ktoré zakazujú ukladanie stránok do vyrovnávacej pamäte (rovnaký obmedzovač vyrovnávacej pamäte). Pre html je to správne a potrebné. Keď sa však pokúsite odoslať súbor pomocou skriptu, ktorý kontroluje autorizáciu, Internet Explorer ho odmietne stiahnuť. Je to kvôli tomuto titulu. Zavolajte
    musí vyriešiť problém pred začatím relácie.
  • musí vyriešiť problém pred začatím relácie. $_SESSION Nemôžete použiť číselné indexy - Nemôžete použiť číselné indexy -$_SESSION [ 1 ], $_SESSION [ "10" ]
  • - relácie nebudú fungovať. Niekde medzi verziami 4.2 a 5.0 nebolo možné nastaviť session.use_trans_sid pomocou. Od verzie 5.0 je to už opäť možné.
  • Pred verziou 4.3.3 súboru cookie PHP odosielalo cookie iba vtedy, ak pri spustení relácie nebol v požiadavke žiadny identifikátor. Teraz sa pri každom hovore odosiela cookie session_start()

    Príklad autorizácie pomocou relácií
    Ilustrujme všetko vyššie na malom príklade:
    Vytvorme súbor auth.php:
    if (isset($_POST [ "auth_name" ]))
    {
    $sql = "SELECT * FROM users WHERE name=?s";
    $row = $db -> getRow($sql, $_POST["názov_autorizácie"]);
    if ($row && password_verify ($_POST [ "auth_pass" ], $row [ "pass" ])) (
    $_SESSION [ "user_id" ] = $riadok [ "id" ];
    }
    header("Umiestnenie: http://" . $_SERVER [ "HTTP_HOST" ]. $_SERVER [ "REQUEST_URI" ]);
    VÝCHOD;
    }

    if (isset($_GET [ "akcia" ]) AND $_GET [ "akcia" ]== "odhlásenie" ) (
    session_start();
    session_destroy();
    header("Umiestnenie: http://" . $_SERVER [ "HTTP_HOST" ]. "/" );
    VÝCHOD;
    }

    if (!isset($_SESSION [ "user_id" ])) (
    ?>








    VÝCHOD;
    }

    Teraz všetko, čo musíte urobiť, je napísať riadok vo všetkých chránených skriptoch
    vyžadovať "auth.php" ;
    Tento príklad predpokladá, že relácia sa už začala a spojenie s databázou bolo vytvorené pomocou triedy Class pre bezpečnú a pohodlnú prácu s MySQL. Tiež predpokladá, že heslo je hašované pomocou odporúčanej funkcie password_hash.
    Príklad chráneného súboru:

    session_start();
    obsahovať "safemysql.class.php" ;
    $db = nový safemysql ([ "db" => "test" ]);
    zahrnúť "auth.php" ;
    ?>
    tajný

    odhlásenie

    OPS! Veľmi užitočné odkazy:
    http://www.php.net/manual/ru/ref.session.php - najnovšie a najaktuálnejšie informácie o podpore relácie v PHP v oficiálnej dokumentácii, plus početné komentáre používateľov. Vysoko odporúčané čítanie.
    http://phpclub.ru/manrus/f/ref.session.html – VEĽMI zastaraný preklad tejto kapitoly do ruštiny z dokumentácie preloženej Alexandrom Pyramidinom.
    http://phpclub.ru/detail/article/sessions
    Článok s patetickým názvom „Pravda o reláciách“. Zanecháva ambivalentný dojem. Na začiatku autor hovorí VEĽMI jasne o mechanizme relácie, ale metódy, ktoré ponúka na konci článku, sú úplne nejasné.

    Učebnicový článok od Dmitrija Borodina zo stránky
    http://php.spb.ru/ sa dôrazne NEODPORÚČA.
    Chlapci, je to strašne zastarané. Nielen, že obsahuje faktické nepresnosti, ale relácie v PHP jednoducho už dlho nefungujú.
    Veľká vďaka za to Dime, toto bol prvý článok o reláciách v ruštine, sám som z neho študoval, ale teraz ho potrebujem poslať na zaslúžený odpočinok.
    Žiaľ, aj mnohé ďalšie roky neaktualizované články na internete sú zastarané.

  • Od samého začiatku všetci prijali PHP s hrou, no akonáhle sa v tomto jazyku začali vytvárať pomerne veľké projekty, vývojári čelili novému problému – v PHP chýbal koncept globálnych premenných! To znamená, že sa spustil určitý skript, odoslal vygenerovanú stránku klientovi a všetky zdroje používané týmto skriptom boli zničené. Pokúsim sa to ilustrovať: predpokladajme, že jedna stránka má dve stránky, index.php a dothings.php. Zdroje pre tieto stránky vyzerajú takto:

    index.php veci.php

    Ak spustíme tieto dva skripty, tak na prvej stránke uvidíme nápis „Bol som priradený k index.php“ a druhá stránka bude prázdna.

    Vývojári webových stránok bez rozmýšľania začali používať cookies na ukladanie globálnych premenných na strane klienta. Proces vyzeral asi takto: používateľ príde na hlavnú stránku webu, vykoná nejaké akcie a všetky informácie spojené s týmto používateľom, ktoré môžu byť potrebné na iných stránkach webu, sa uložia do jeho prehliadača vo forme cookies. Táto metóda má dosť vážne nevýhody, kvôli ktorým sa veľa vývojárov naraz odvrátilo od PHP. Potrebujeme napríklad autorizovať používateľa, aby sme mu umožnili prístup k súkromným (alebo súkromným) sekciám webu. Používateľovi budete musieť poslať súbor cookie, ktorý bude slúžiť ako jeho následný identifikátor na stránke. Tento prístup sa stáva veľmi ťažkopádnym a nepohodlným, akonáhle stránka začne zhromažďovať stále viac informácií o správaní používateľa, pretože je vhodné zakódovať všetky informácie odosielané používateľovi, aby ich nebolo možné sfalšovať. Len nedávno bolo možné pomocou falšovania súborov cookie „rozlúštiť“ viac ako jeden rozhovor a niekedy dokonca preniknúť do pošty niekoho iného. Okrem toho sú na svete stále čudní ľudia, ktorých prehliadač nepodporuje cookies.

    Nebudem sa venovať technologickým otázkam mechanizmu session, ale len popíšem, ako správne pracovať s sessions v PHP.

    Ako pracovať s reláciami?

    Ak otestujete príklady z článku (alebo vaše skripty) na akomkoľvek komerčnom hostingu, nemali by byť s prácou s reláciami žiadne problémy. Ak si svoj server nastavíte sami (či už ide o skutočný server alebo emulátor), môžu sa objaviť chyby s niečím takým:

    "Upozornenie: open(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) zlyhalo: Žiadny takýto súbor alebo adresár (2)."

    To len znamená, že váš PHP je nesprávne nakonfigurovaný. Tento problém môžete vyriešiť zadaním správnej cesty (k existujúcemu adresáru) na ukladanie relácií do súboru php.ini a reštartovaním servera.

    Každý skript, ktorý bude používať premenné (údaje) z relácií, musí obsahovať nasledujúci riadok:

    Session_start();

    Tento príkaz informuje server, že daná stránka potrebuje všetky premenné, ktoré sú spojené s daným používateľom (prehliadačom). Server vezme tieto premenné zo súboru a sprístupní ich. Je veľmi dôležité otvoriť reláciu pred odoslaním akýchkoľvek údajov používateľovi; v praxi to znamená, že funkciu session_start() je vhodné zavolať hneď na začiatku stránky, napríklad takto:

    Session_start(); ?> ... Na nastavenie adresára, do ktorého sa budú ukladať súbory relácie, použite funkciu session_save_path(): session_save_path($_SERVER["DOCUMENT_ROOT"]."/session"); session_start();

    Po spustení relácie môžete nastaviť globálne premenné.

    index.php Pri priraďovaní akejkoľvek hodnoty do ľubovoľného poľa poľa $_SESSION sa premenná s rovnakým názvom automaticky zaregistruje ako premenná relácie.

    veci.php

    Toto pole je dostupné na všetkých stránkach používajúcich reláciu. Pozrime sa napríklad na program:

    Všetko je v poriadku. Relácia bola načítaná!

    Poďme cez to a uvidíme, čo tam je:

    Pri postupnom spúšťaní týchto súborov vytvorí prvý skript „index.php“ nasledujúci výsledok:

    Všetko je v poriadku. Relácia bola načítaná! Poďme cez to a uvidíme, čo tam je:

    A druhý „dothings.php“ je toto:

    • Bol som požiadaný o index.php Premenná $a je teraz dostupná na všetkých stránkach daného webu, ktoré spustili relácie.
    • Ďalšie užitočné funkcie a techniky na prácu s reláciami: unset($_SESSION["a"])
    • - relácia „zabudne“ hodnotu špecifikovanej premennej relácie;- pomocou tejto funkcie môžete nastaviť, ako dlho bude relácia „žiť“ nastavením unix_timestamp, ktorý určuje čas „smrtia“ relácie. V predvolenom nastavení je relácia „živá“, kým klient nezavrie okno prehliadača.
    • session_write_close()- zaznamenávanie premenných relácie a jej zatvorenie.

    Toto je potrebné na otvorenie stránky v novom okne, ak spracovanie stránky trvá dlho a zablokoval súbor relácií pre váš prehliadač.

    Príklady

    Teraz prejdime k praktickej aplikácii mechanizmu relácie. Tu sa pozrieme na pár pomerne jednoduchých a zároveň užitočných príkladov.

    Autorizácia používateľa

    Otázky týkajúce sa autorizácie používateľov pomocou relácií PHP sú neustále kladené na konferenciách o webovom programovaní. Mechanizmus autorizácie používateľov v systéme pomocou relácií je z bezpečnostného hľadiska celkom dobrý (pozri časť).

    Náš príklad bude pozostávať z troch súborov: index.php, authorize.php a secretplace.php. Súbor index.php obsahuje formulár, kde užívateľ zadá svoje užívateľské meno a heslo. Tento formulár odovzdá údaje do súboru authorize.php, ktorý, ak je autorizácia úspešná, umožní používateľovi prístup k súboru secretplace.php a v opačnom prípade zobrazí chybové hlásenie. index.php Príklady:

    Zadajte svoje heslo
    Prihlásenie:


    heslo: autorizovať.php stránka... header("Umiestnenie: tajné miesto.php");

    VÝCHOD; ) ) // ak niečo nebolo v poriadku, používateľ dostane // chybové hlásenie. ?>Zadali ste nesprávne heslo!

    Bezpečnosť

    tajné miesto.php

    • Dobrý deň,
    • , ste na tajnej stránke!!! :)
    • Takže sme schopní preniesť identifikátor z jednej stránky (PHP skript) na druhú (až do ďalšieho volania z našej stránky), čo znamená, že dokážeme rozlíšiť všetkých návštevníkov stránky. Keďže identifikátor relácie je veľmi veľké číslo (128 bitov), ​​nie je prakticky žiadna šanca, že by sa dal nájsť hrubou silou. Útočníkovi teda zostávajú nasledujúce možnosti:

    v počítači používateľa je trójsky kôň, ktorý kradne čísla relácií;

    útočník zachytí komunikáciu medzi počítačom používateľa a serverom. Samozrejme, existuje bezpečný (šifrovaný) protokol SSL, no nie každý ho používa;

    • Sused sa priblížil k počítaču nášho používateľa a ukradol číslo relácie.
    • Súbor secretplace.php je pokus o oklamanie programu zadaním hodnôt premennej $logged_user do panela s adresou prehliadača, napríklad takto:
      "http://www.yoursite.ru/secretplace.php? prihlásený_používateľ=hacker"

    V našom programe sú teda jasne viditeľné dve „diery“, jedna je malá a nie je zvlášť nápadná, ale druhá je jednoducho obrovská, cez ktorú sa väčšina hackerov dostane tam, kam nepotrebuje.

    Ako „zaplátať“ otvor číslo 1?

    Nebudeme písať tony kódu na zablokovanie IP adresy a pod., ale jednoducho skontrolujeme, odkiaľ požiadavka pochádza, respektíve z akej stránky požiadavka prišla, ak je to nejaká stránka z nášho webu, tak je všetko v poriadku, ale v všetky ostatné prípady vás nepustíme dovnútra. Upravme súbor authorize.php:

    autorizovať.php V2 stránka... header("Umiestnenie: tajné miesto.php"); stránka... header("Umiestnenie: tajné miesto.php");


    VÝCHOD; ) ) ? >

    Ako sa zbaviť "diery" číslo 2? Povedzme, že máte webovú stránku, na ktorej sa môže každý zaregistrovať a prispievať do fóra. Prirodzene, vo fóre majú niektorí používatelia (administrátori, moderátori) viac príležitostí ako iní, napríklad môžu mazať správy od iných používateľov. Úroveň prístupu používateľa uložíte do relácie, do premennej $user_status, kde $user_status = 10 zodpovedá plnému prístupu do systému. Útočníkovi, ktorý príde na stránku, sa stačí bežným spôsobom zaregistrovať a potom pridať do panela s adresou prehliadača

    ?user_status=10

    . Takže máte nového admina na vašom fóre! ?>V princípe je možné cez adresný riadok nastaviť ľubovoľnú premennú skriptu jednoduchým pridaním otáznika a názvu premennej s jej hodnotou za úplnú adresu do skriptu. Opravme náš kód, aby sme tomu zabránili:

    secretplace.php V2

    premenná unset($_SESSION["prihlásený_používateľ"]);

    Toto je potrebné na otvorenie stránky v novom okne, ak spracovanie stránky trvá dlho a zablokoval súbor relácií pre váš prehliadač.

    ?>
    // Automaticky vložiť SID do odkazov. ini_set("session.use_trans_sid", true); session_start(); ?> Kliknite sem!
    Kliknite sem!!



    // Príklad práce s reláciami. session_start(); // Ak ste práve navštívili stránku, vynulujte počítadlo. if (!isset($_SESSION["počet"])) $_SESSION["počet"] = 0; //Zvýšenie počítadla v relácii. $_SESSION["count"] = $_SESSION["count"] + 1; ?>

    Počítadlo

    čas(y).
    Zatvorte prehliadač a vynulujte počítadlo.
    " target="_blank"> Otvorte detské okno prehliadača.
    // Jednoduchý príklad použitia relácií bez súborov cookie. session_name("test"); session_start(); $_SESSION["count"] = @$_SESSION["count"] + 1; ?>

    Počítadlo

    Túto stránku ste otvorili vo svojej aktuálnej relácii prehliadačačas(y).
    Ak chcete resetovať toto počítadlo, zatvorte prehliadač.
    ?">Kliknutím sem obnovíte stránku!

    Relácie vám umožní vytvoriť spojenie medzi návštevníkom a webom pomocou ID relácie.

    Premenné relácie a ich hodnoty sú uložené iba na serveri. Na počítači používateľa a serveri je uložený iba identifikátor relácie (náhodne vygenerovaný), čo nám umožňuje nadviazať spojenie medzi používateľom a serverom.

    ID relácie uložené v počítači používateľa je súbor cookie.

    Súbor cookie sa uloží v prehliadači používateľa a na serveri sa vytvorí aj príslušný súbor.

    Vytvorte reláciu

    Najjednoduchší spôsob, ako otvoriť reláciu, je použiť funkciu session_start:

    // spustenie relácie session_start();

    Táto funkcia skontroluje, či ID relácie existuje, a ak nie, vytvorí ho. Ak aktuálne ID relácie už existuje, načítajú sa registrované premenné relácie.

    Táto konštrukcia (musí byť volaná raz pre každú stránku) musí byť volaná pred akýmkoľvek záverom(toto pravidlo funguje aj pre setcookie()), vrátane medzier.

    Po vytvorení relácie sa do prehliadača odošle nasledujúci súbor cookie:

    PHP

    echo "Názov relácie: ".názov_relácie(). " ID relácie: ".session_id(); // Názov relácie: PHPSESSID ID relácie: mceu820l02id3ds0vcvtgnht04

    Vytvorte premennú relácie

    Premenná relácie sa vytvorí pridaním hodnoty do superglobálneho poľa $_SESSION:

    $_SESSION["nick"] = $_POST["meno"];

    Zničenie premenných relácie a samotnej relácie

    1. Premennú relácie môžete odstrániť takto:

    Unset($_SESSION["prezývka"]);

    Tým sa zabráni opätovnému použitiu informácií.

    Ale je lepšie len vyčistiť pole $_SESSION (odstrániť všetky premenné relácie):

    //vymazať pole $_SESSION $_SESSION = pole();

    2. Musíte tiež urobiť nasledovné:

    Nastaviť neplatný súbor cookie relácie:

    If (isset($_COOKIE)) ( // session_name() - získajte názov aktuálnej relácie setcookie(session_name(), "", time()-86400, "/"); )

    Názov relácie odkazuje na ID relácie v súboroch cookie a URL

    3. Zničiť (ukončiť) reláciu

    Session_destroy();

    Výstupné ukladanie do vyrovnávacej pamäte

    Ak už máte nejaký výstup, môžete použiť funkciu ob_start(). Táto funkcia ukladá výstup do vyrovnávacej pamäte. Teraz sa výstup neodošle do prehliadača, pokiaľ to nevynútite pomocou funkcie ob_end_flush().

    "; unset($_SESSION["nick"]); if (isset($_COOKIE)) ( setcookie(session_name(), "", time()-86400, "/"); // obsah relácie - prázdny reťazec ) // setcookie bude fungovať bez chýb, keďže sme práve ob_end_flush( // odoslali výstup do prehliadača session_destroy();

    Na druhej strane nie je vždy potrebné použiť funkciu ob_end_flush(), pretože interpret PHP automaticky vyprázdni vyrovnávaciu pamäť pri spustení skriptu.

    Opätovné vytvorenie ID relácie

    Z bezpečnostných dôvodov musíte pri každom prihlásení do systému znova vytvoriť ID relácie. Informácie v premenných relácie sa zachovajú, zmení sa iba identifikátor relácie. Nezabudnite, informácie o relácii sú uložené na webovom serveri ako text v príslušnom súbore. Ak chcete vygenerovať id, zavolajte session_regenerate_id() a obnovte aktuálnu stránku alebo presmerujte používateľa na inú stránku.

    Mechanizmus relácie


    Zníženie životnosti relácie

    Predvolene je životnosť relácie 0, čo znamená, že keď používateľ zavrie okno prehliadača, relácia sa zničí. Niekedy je potrebné ukončiť reláciu používateľa z dôvodu nečinnosti z jeho strany. Dá sa to zrealizovať nasledovným spôsobom (pozrime si príklad autorizácie): vytvoríme premennú a uložíme do nej čas autorizácie užívateľa, ak sa pokúsime obnoviť stránku, porovnáme čas s časom nečinnosti a, pri jej prekročení užívateľa odhlásime a presmerujeme na autorizačnú stránku.

    $_SESSION["začiatok"] = čas(); // časová pečiatka autorizácie používateľa $now = time(); // aktuálny čas $time_limit = 1000; // maximálny povolený čas nečinnosti používateľa v sekundách. if ($now > $_SESSION["start"] + $time_limit) ( echo "Váš čas vypršal"; //...... // a vymažte reláciu a jej cookie) else ( $_SESSION["začať " ] = time(); ) // v prípade objednávky aktualizujte

    Ako urobiť reláciu po celý život večným?

    Aby klient zostal vždy prihlásený, nie je potrebné nastavovať dobu trvania relácie na večnú. Relácia je relácia: začína, keď klient príde, a končí, keď klient odchádza.

    Keď klient znova príde, musíte začať novú reláciu, ale načítať do nej údaje o klientovi na základe jedinečného súboru cookie pre klienta, ktorý sa mu natrvalo nainštaluje, keď zaškrtne políčko, napríklad „zapamätať si ma “.

    Práca s reláciou, keď sú súbory cookie zakázané

    Ak je nastavenie session.use_trans_sid nastavené na 1, potom keď sú cookies zakázané, PHP odovzdá PHPSESSID pomocou metódy GET v riadku požiadavky.