Përshëndetje, komunitet i dashur.
Së pari, dua t'ju falënderoj për shumë burim i dobishëm. Më shumë se një herë kam gjetur shumë ide interesante dhe këshilla praktike këtu.
Qëllimi i këtij artikulli është të nxjerrë në pah kurthet e përdorimit të seancave në PHP. Sigurisht, ka dokumentacion për PHP dhe shumë shembuj, dhe ky artikull nuk pretendon të jetë udhëzues i plotë. Është krijuar për të zbuluar disa nga nuancat e punës me sesione dhe për të mbrojtur zhvilluesit nga humbja e panevojshme e kohës.
Shembulli më i zakonshëm i përdorimit të sesioneve është, natyrisht, autorizimi i përdoruesit. Le të fillojmë me zbatimin më themelor, në mënyrë që ta zhvillojmë gradualisht ndërsa lindin detyra të reja.
(Për të kursyer hapësirë dhe kohë, ne do t'i kufizojmë shembujt tanë vetëm në vetë funksionet e sesionit, në vend që të ndërtojmë këtu një aplikacion testimi të plotë me një hierarki të bukur të klasës, trajtim gjithëpërfshirës të gabimeve dhe gjëra të tjera të mira).
Funksioni startSession() ( // Nëse sesioni ka filluar tashmë, ndaloni ekzekutimin dhe kthejeni TRUE // (parametri session.auto_start në skedarin e cilësimeve php.ini duhet të çaktivizohet - vlera e paracaktuar) nëse (session_id()) kthehet true; else return session_start( // Shënim: Përpara versionit 5.3.0, funksioni session_start() ktheu TRUE edhe nëse kishte një gabim // Nëse jeni duke përdorur një version më të hershëm se 5.3.0, bëni një kontroll shtesë për session_id() // pas thirrjes së funksionit session_start() shkatërrojëSession() ( if (session_id()) ( // Nëse ka seancë aktive, fshini kukit e sesionit, setcookie(emri_sesionit(), sesioni_id(), koha()-60*60*24); // dhe shkatërroni sesionin session_unset(); sesion_shkatërrim(); ))
Shënim: Nënkuptohet se njohuri baze Lexuesi di për sesionet PHP, kështu që ne nuk do të mbulojmë këtu parimin e funksionimit të funksioneve session_start() dhe session_destroy(). Detyrat e paraqitjes së formularit të hyrjes dhe vërtetimi i përdoruesit nuk lidhen me temën e artikullit, kështu që ne gjithashtu do t'i heqim ato. Më lejoni t'ju kujtoj se për të identifikuar përdoruesin në çdo kërkesë pasuese, në momentin e hyrjes me sukses, duhet të ruajmë identifikuesin e përdoruesit në një variabël sesioni (për shembull, me emrin userid), i cili do të jetë i disponueshëm në të gjitha kërkesat pasuese brenda jeta e seancës. Është gjithashtu e nevojshme të zbatohet përpunimi i rezultatit të funksionit tonë startSession(). Nëse funksioni kthehet FALSE, shfaqni formularin e hyrjes në shfletues. Nëse funksioni u kthye TRUE, dhe një variabël sesioni që përmban identifikuesin e përdoruesit të autorizuar (në rastin tonë - userid), ekziston - shfaqni faqen e përdoruesit të autorizuar (për më shumë informacion rreth trajtimit të gabimeve, shihni shtimin e datës 2013-06- 07 në seksionin mbi variablat e sesionit).
Deri këtu gjithçka është e qartë. Pyetjet fillojnë kur ju duhet të zbatoni kontrollin e pasivitetit të përdoruesit (përfundimi i sesionit), të mundësoni përdorues të shumtë të punojnë njëkohësisht në një shfletues dhe gjithashtu të mbroni seancat nga përdorimi i paautorizuar. Kjo do të diskutohet më poshtë.
Funksioni startSession() ( // Koha e paaktivitetit të përdoruesit (në sekonda) $sessionLifetime = 300; nëse (session_id()) kthehet e vërtetë; // Cakto jetëgjatësinë e kukive ini_set("session.cookie_lifetime", $sessionLifetime); // Nëse përdoruesi caktohet koha e mbylljes së pasivitetit, caktoni jetëgjatësinë e sesionit në server // Shënim: Për një server prodhimi, rekomandohet të paracaktoni këto parametra në skedarin php.ini nëse ($sessionLifetime) ini_set("session.gc_maxlifetime", $sessionLifetime nëse (sesion_start(); )) ( setcookie(sesion_name(), session_id(), time()+$sessionLifetime); kthen true; ) përndryshe kthe false)
Disa sqarime. Siç e dini, PHP përcakton se cili sesion duhet të nisë nga emri i cookie-t të dërguar nga shfletuesi në kokën e kërkesës. Shfletuesi, nga ana tjetër, e merr këtë cookie nga serveri, ku funksioni session_start() e vendos atë. Nëse cookie-i i shfletuesit ka skaduar, ai nuk do të dërgohet në kërkesë, që do të thotë se PHP nuk do të jetë në gjendje të përcaktojë se cilin sesion të fillojë dhe do ta trajtojë këtë si krijimi i një sesioni të ri. Parametri i cilësimeve të PHP-së session.gc_maxlifetime, i cili është vendosur i barabartë me kohën tonë të mosaktivitetit të përdoruesit, cakton jetëgjatësinë e një sesioni PHP dhe kontrollohet nga serveri. Kontrolli i jetëgjatësisë së sesionit funksionon si më poshtë (këtu konsiderojmë një shembull të ruajtjes së sesioneve në skedarë të përkohshëm si opsioni më i zakonshëm dhe i paracaktuar në PHP).
Kur krijohet një sesion i ri, një skedar i quajtur sess_ krijohet në drejtorinë e vendosur si drejtoria e ruajtjes së sesioneve në parametrin e cilësimeve PHP session.save_path
Shënim: Duhet të theksohet këtu se parametri session.gc_maxlifetime zbatohet për të gjitha sesionet brenda një serveri (më saktë, brenda një procesi kryesor PHP). Në praktikë, kjo do të thotë që nëse disa sajte po funksionojnë në server dhe secila prej tyre ka afatin e vet të mosaktivitetit të përdoruesit, atëherë vendosja e këtij parametri në një nga faqet do të çojë në vendosjen e tij për faqet e tjera. E njëjta gjë vlen edhe për pritjen e përbashkët. Për të shmangur këtë situatë, drejtoritë e veçanta të sesioneve përdoren për çdo sajt brenda të njëjtit server. Vendosja e shtegut për në direktorinë e sesioneve bëhet duke përdorur parametrin session.save_path në skedarin e cilësimeve php.ini, ose duke thirrur funksionin ini_set(). Pas kësaj, sesionet e çdo sajti do të ruhen në drejtori të veçanta dhe parametri session.gc_maxlifetime i vendosur në një nga sajtet do të jetë i vlefshëm vetëm për sesionin e tij. Ne nuk do ta shqyrtojmë këtë rast në detaje, veçanërisht pasi kemi një opsion më fleksibël për monitorimin e pasivitetit të përdoruesit.
Për të zgjidhur këtë problem, ne do të braktisim përdorimin e mekanizmave të integruar PHP dhe do të prezantojmë disa variabla të reja të sesionit që do të na lejojnë të kontrollojmë vetë kohën e pasivitetit të përdoruesit.
Funksioni startSession($isUserActivity=true) ($sessionLifetime = 300; nëse (session_id()) kthehet true; // Cakto jetëgjatësinë e cookie-t përpara mbylljes së shfletuesit (ne do të kontrollojmë gjithçka në anën e serverit) ini_set("sesion. cookie_lifetime", 0) ; nëse (! session_start()) kthen false; $t = time(); nëse ($sessionLifetime) ( // Nëse koha e paaktivitetit të përdoruesit është caktuar, // kontrolloni kohën e kaluar që nga aktiviteti i fundit i përdoruesit // (koha e kërkesës së fundit) kur u përditësua ndryshorja e sesionit të aktivitetit të fundit) nëse (isset($_SESSION["lastactivity"]) && $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( // Nëse koha e kaluar që nga aktiviteti i fundit i përdoruesit, // është më i madh se koha e pasivitetit, që do të thotë se sesioni ka skaduar dhe sesioni duhet të ndërpritet shkatërrojëSession( else ( // Nëse skadimi nuk ka ndodhur ende, // dhe nëse Kërkesa erdhi si rezultat i aktivitetit të përdoruesit, // përditësoni variablin e fundit të aktivitetit me vlerën e kohës aktuale, // duke e zgjatur kohën e seancës me një seancë tjetër Lifetime nëse ($isUserActivity) $_SESSION["lastactivity"] =; $t; ) ) kthimi i vërtetë; )
Le të përmbledhim. Në çdo kërkesë kontrollojmë nëse është arritur afati që nga aktiviteti i fundit i përdoruesit deri në momentin aktual dhe nëse është arritur, shkatërrojmë seancën dhe ndërpresim ekzekutimin e funksionit, duke e kthyer FALSE. Nëse koha nuk është arritur dhe parametri $isUserActivity me vlerën TRUE i kalohet funksionit, ne përditësojmë kohën e aktivitetit të fundit të përdoruesit. Gjithçka që duhet të bëjmë është të përcaktojmë në skriptin e thirrjes nëse kërkesa është rezultat i aktivitetit të përdoruesit dhe nëse jo, thirrni funksionin startSession me parametrin $isUserActivity të vendosur në FALSE.
Përditësim nga 07-06-2013Përpunimi i rezultatit të funksionit sesionStart().
Komentet theksuan se kthimi FALSE nuk ofron një kuptim të plotë të shkakut të gabimit, dhe kjo është absolutisht e drejtë. Unë nuk publikova trajtimin e detajuar të gabimeve këtu (gjatësia e artikullit tashmë është mjaft e madhe), pasi kjo nuk lidhet drejtpërdrejt me temën e artikullit. Por duke pasur parasysh komentet, unë do të sqaroj.
Siç mund ta shihni, funksioni sesionStart mund të kthejë FALSE në dy raste. Ose sesioni nuk mund të fillonte për shkak të disa gabimeve të brendshme të serverit (për shembull, cilësimet e pasakta të sesionit në php.ini), ose kohëzgjatja e sesionit ka skaduar. Në rastin e parë, duhet ta ridrejtojmë përdoruesin në një faqe me një gabim që thotë se ka probleme në server dhe një formular për të kontaktuar mbështetjen. Në rastin e dytë, ne duhet ta transferojmë përdoruesin në formularin e hyrjes dhe të shfaqim një mesazh përkatës në të që thotë se sesioni ka skaduar. Për ta bërë këtë, ne duhet të fusim kodet e gabimit dhe të kthejmë kodin përkatës në vend të FALSE, dhe në metodën e thirrjes, ta kontrollojmë dhe të veprojmë në përputhje me rrethanat.
Tani, edhe nëse një sesion në server ekziston ende, ai do të shkatërrohet herën e parë kur aksesohet nëse afati i pasivitetit të përdoruesit ka skaduar. Dhe kjo do të ndodhë pavarësisht nga jeta e sesionit të caktuar në cilësimet globale të PHP.
Shënim:Çfarë ndodh nëse shfletuesi mbyllet dhe cookie-ja e emrit të sesionit shkatërrohet automatikisht? Kërkesa për serverin herën tjetër që do të hapet shfletuesi nuk do të përmbajë kukit e sesionit dhe serveri nuk do të jetë në gjendje të hapë seancën dhe të kontrollojë kohën e paaktivitetit të përdoruesit. Për ne, kjo është e barabartë me krijimin e një sesioni të ri dhe nuk ndikon në asnjë mënyrë funksionalitetin ose sigurinë. Por lind një pyetje e drejtë - kush do ta shkatërrojë më pas seancën e vjetër, nëse deri më tani e kemi shkatërruar pas skadimit të afatit? Apo do të mbetet përgjithmonë në drejtorinë e sesioneve? Për të pastruar seancat e vjetra në PHP, ekziston një mekanizëm i quajtur mbledhja e mbeturinave. Ai funksionon në momentin e kërkesës së radhës në server dhe pastron të gjitha seancat e vjetra bazuar në datën e fundit të modifikimit të skedarëve të sesionit. Por mekanizmi i mbledhjes së mbeturinave nuk fillon me çdo kërkesë drejtuar serverit. Frekuenca (ose më mirë, probabiliteti) i nisjes përcaktohet nga dy parametrat e cilësimeve session.gc_probability dhe session.gc_divisor. Rezultati i ndarjes së parametrit të parë me të dytin është probabiliteti i nisjes së mekanizmit të grumbullimit të mbeturinave. Kështu, në mënyrë që mekanizmi i pastrimit të sesionit të hapet me çdo kërkesë në server, këto parametra duhet të vendosen në vlera të barabarta, për shembull "1". Kjo qasje garanton një drejtori të pastër të sesioneve, por padyshim është shumë e shtrenjtë për serverin. Prandaj, në sistemet e prodhimit, vlera e paracaktuar e session.gc_divisor është vendosur në 1000, që do të thotë se mekanizmi i grumbullimit të mbeturinave do të funksionojë me një probabilitet prej 1/1000. Nëse eksperimentoni me këto cilësime në skedarin tuaj php.ini, mund të vini re se në rastin e përshkruar më sipër, kur shfletuesi mbyllet dhe pastron të gjitha kukit e tij, ka ende seanca të vjetra të mbetura në drejtorinë e sesioneve për pak kohë. Por kjo nuk duhet t'ju shqetësojë, sepse... siç u tha tashmë, kjo nuk ndikon në asnjë mënyrë në sigurinë e mekanizmit tonë.
Përditësim nga 07-06-2013Parandalimi i ngrirjes së skripteve për shkak të bllokimit të skedarit të sesionit
Komentet ngritën çështjen e ngrirjes së ekzekutimit të njëkohshëm të skripteve për shkak të bllokimit të skedarit të sesionit (opsioni më i mrekullueshëm është sondazhi i gjatë).
Për të filluar, vërej se ky problem nuk varet drejtpërdrejt nga ngarkesa e serverit ose numri i përdoruesve. Sigurisht se më shumë kërkesa, aq më ngadalë ekzekutohen skriptet. Por kjo është një varësi indirekte. Problemi shfaqet vetëm brenda një sesioni, kur serveri merr disa kërkesa në emër të një përdoruesi (për shembull, njëra prej tyre është sondazh i gjatë, dhe pjesa tjetër janë kërkesa të rregullta). Çdo kërkesë përpiqet të hyjë në të njëjtin skedar sesioni, dhe nëse kërkesa e mëparshme nuk e zhbllokoi skedarin, atëherë kërkesa e mëpasshme do të mbetet në pritje.
Për të mbajtur në minimum bllokimin e skedarit të sesionit, rekomandohet fuqimisht mbyllja e sesionit duke thirrur funksionin session_write_close() menjëherë pasi të kenë përfunduar të gjitha veprimet me variablat e sesionit. Në praktikë, kjo do të thotë që ju nuk duhet të ruani gjithçka në variablat e sesionit dhe t'i aksesoni ato gjatë gjithë ekzekutimit të skriptit. Dhe nëse keni nevojë të ruani disa të dhëna pune në variablat e sesionit, atëherë lexoni ato menjëherë kur të fillojë sesioni, ruajini ato në variabla lokale për përdorim të mëvonshëm dhe mbyllni seancën (që do të thotë mbyllja e seancës duke përdorur funksionin session_write_close dhe jo shkatërrimi duke përdorur session_destroy ).
Në shembullin tonë, kjo do të thotë që menjëherë pas hapjes së një sesioni, duke kontrolluar jetëgjatësinë e tij dhe ekzistencën e një përdoruesi të autorizuar, ne duhet të lexojmë dhe ruajmë të gjitha shtesë kërkohet nga aplikacioni variablat e sesionit (nëse ekzistojnë), më pas mbyllni seancën duke përdorur një thirrje për session_write_close() dhe vazhdoni të ekzekutoni skriptin, qoftë një sondazh i gjatë apo një kërkesë e rregullt.
Pse ishte e mundur kjo? Natyrisht, sepse emri dhe identifikuesi i sesionit janë gjithmonë të njëjtë për të gjithë jetëgjatësinë e sesionit, dhe nëse i merrni këto të dhëna, mund të dërgoni lehtësisht kërkesa në emër të një përdoruesi tjetër (sigurisht, brenda jetëgjatësisë së këtij sesioni). Ky mund të mos jetë lloji më i zakonshëm i sulmit, por teorikisht duket mjaft i realizueshëm, veçanërisht duke marrë parasysh që një trojan i tillë nuk ka nevojë as për të drejtat e administratorit për të grabitur cookie-t e shfletuesit të përdoruesit.
Si mund të mbroheni nga sulmet e këtij lloji? Përsëri, padyshim, duke kufizuar jetëgjatësinë e identifikuesit të sesionit dhe duke ndryshuar periodikisht identifikuesin brenda të njëjtit sesion. Ne gjithashtu mund të ndryshojmë emrin e sesionit duke fshirë plotësisht të vjetrën dhe duke krijuar një sesion të ri, duke kopjuar të gjitha variablat e sesionit nga ai i vjetër në të. Por kjo nuk ndikon në thelbin e qasjes, kështu që për thjeshtësi do të kufizohemi vetëm në identifikuesin e sesionit.
Është e qartë se sa më e shkurtër jetëgjatësia e ID-së së sesionit, aq më pak kohë do të ketë një sulmues për të marrë dhe përdorur cookie për të falsifikuar një kërkesë përdoruesi. Idealisht, një identifikues i ri duhet të përdoret për çdo kërkesë, i cili do të minimizojë mundësinë e përdorimit të seancës së dikujt tjetër. Por ne do të shqyrtojmë rastin e përgjithshëm kur koha e rigjenerimit të identifikuesit të sesionit caktohet në mënyrë arbitrare.
(Ne do të heqim pjesën e kodit që tashmë është diskutuar).
Funksioni startSession($isUserActivity=true) (// Jetëgjatësia e identifikuesit të sesionit $idLifetime = 60; ... nëse ($idLifetime) ( // Nëse jetëgjatësia e identifikuesit të sesionit është caktuar, // kontrolloni kohën e kaluar që kur seanca ishte krijuar ose rigjenerimi i fundit // (koha e kërkesës së fundit kur u përditësua variabli i sesionit koha e fillimit) if (isset($_SESSION["starttime"])) ( if ($t-$_SESSION["starttime"] >= $ idLifetime) ( // Jeta e identifikuesit të seancës kohore ka skaduar // Gjeneroni një identifikues të ri session_regenerate_id(true); $_SESSION["starttime"] = $t) ) tjetër ( // Ne arrijmë këtu nëse seanca sapo është krijuar // Cakto kohën e gjenerimit të identifikuesit të sesionit në koha aktuale$_SESSION["fillimi"] = $t; ) ) kthimi i vërtetë; )
Pra, kur krijojmë një sesion të ri (që ndodh kur përdoruesi regjistrohet me sukses), vendosim variablin e seancës starttime, e cila ruan për ne kohën e gjeneratës së fundit të identifikuesit të sesionit, në një vlerë të barabartë me kohën aktuale të serverit. Më pas, në çdo kërkesë, ne kontrollojmë nëse ka kaluar mjaft kohë (idLifetime) nga gjenerimi i fundit i identifikuesit dhe nëse po, ne gjenerojmë një të ri. Kështu, nëse gjatë jetës së caktuar të identifikuesit sulmuesi që ka marrë cookie-n e përdoruesit të autorizuar nuk ka kohë për ta përdorur atë, kërkesa e rreme do të konsiderohet nga serveri si e paautorizuar dhe sulmuesi do të dërgohet në faqen e hyrjes. .
Shënim: ID-ja e re e sesionit futet në cookie-n e shfletuesit kur thirret funksioni session_regenerate_id(), i cili dërgon cookie-n e ri, të ngjashëm me funksionin session_start(), kështu që ne nuk kemi nevojë ta përditësojmë vetë cookie-n.
Nëse duam t'i bëjmë seancat tona sa më të sigurta, mjafton të vendosim jetëgjatësinë e identifikuesit në një ose madje të heqim funksionin session_regenerate_id() nga kllapat dhe të heqim të gjitha kontrollet, të cilat do të çojnë në rigjenerimin e identifikuesit në secilën prej tyre. kërkesë. (Unë nuk e kam testuar ndikimin e kësaj qasjeje në performancën dhe mund të them vetëm se funksioni session_regenerate_id(true) në thelb kryen vetëm 4 veprime: gjenerimi i një identifikuesi të ri, krijimi i një titulli me skedarin e sesionit, fshirja e të vjetrit dhe krijimi një skedar të ri sesioni).
Digresioni lirik: Nëse trojani rezulton të jetë aq i zgjuar sa nuk do t'i dërgojë cookie sulmuesit, por organizon dërgimin e një kërkese të rreme të parapërgatitur menjëherë pas marrjes së cookie-t, metoda e përshkruar më sipër ka shumë të ngjarë të mos jetë në gjendje të mbrojë kundër të tilla. një sulm, sepse ndërmjet kohës që Trojani merr cookie-n dhe dërgimit të kërkesës së rreme nuk do të ketë praktikisht asnjë ndryshim dhe ka një probabilitet të lartë që në këtë moment identifikuesi i sesionit të mos rigjenerohet.
Në shembujt tanë të mëparshëm, ne nuk specifikuam në mënyrë eksplicite një emër sesioni, kështu që u përdor emri i paracaktuar PHP (PHPSESSID). Kjo do të thotë që të gjitha seancat që kemi krijuar deri tani kanë dërguar një cookie në shfletuesin me emrin PHPSESSID. Natyrisht, nëse emri i cookie-t është gjithmonë i njëjtë, atëherë nuk ka asnjë mënyrë për të organizuar dy sesione me të njëjtin emër brenda të njëjtit shfletues. Por nëse do të përdornim emrin tonë të sesionit për secilin përdorues, problemi do të zgjidhej. Le të bëjmë kështu.
Funksioni startSession($isUserActivity=true, $prefix=null) ( ... nëse (session_id()) kthehet true; // Nëse prefiksi i përdoruesit kalohet në parametrat, // vendosni një emër unik të sesionit që përfshin këtë prefiks, // përndryshe vendos një emër të përbashkët për të gjithë përdoruesit (për shembull, MYPROJECT) emri i sesionit ("MYPROJECT". nëse (! session_start()) kthen false ... )
Tani gjithçka që mbetet është të sigurohemi që skripti thirrës të kalojë një prefiks unik për secilin përdorues në funksionin startSession(). Kjo mund të bëhet, për shembull, duke kaluar një prefiks në parametrat GET/POST të çdo kërkese ose përmes një cookie shtesë.
Funksioni startSession($isUserActivity=true, $prefiks=null) ( $sessionLifetime = 300; $idLifetime = 60; nëse (session_id()) kthehet i vërtetë; emri i sesionit ("MYPROJECT".($prefiksi ? "_".$prefiksi: "")); $t-$_SESSION["lastactivity"] >= $sessionLifetime) (structSession(); kthe false; ) tjetër (nëse ($isUserActivity) $_SESSION["lastactivity"] = $t; ) ) nëse ($idLifetime ) ( if (isset($_SESSION["starttime"])) ( if ($t-$_SESSION["starttime"] >= $idLifetime) ( session_regenerate_id(true); $_SESSION["starttime"] = $t; ) ) else ( $_SESSION["starttime"] = $t; ) ) kthen true funksionin DestructSession() ( if (session_id()) ( session_unset(); setcookie(sesion_em(), session_id(), time() -60*; 60*24 sesion_shkatërrim();
Shpresoj se ky artikull do të kursejë pak kohë për ata që nuk kanë hyrë kurrë shumë thellë në mekanizmin e sesionit dhe do të japë njohuri të mjaftueshme për këtë mekanizëm për ata që sapo kanë filluar të njihen me PHP.
7,7 mijëDuke përdorur seancat PHP serveri ju identifikon dhe ju lejon të kryeni veprimet e nevojshme: ndryshimin e informacionit në faqe të ndryshme web, shtimin e informacionit të ri, etj. Pas përfundimit të punës në sit, ju fshini seancën aktuale duke klikuar në butonin "Dalje":
Një sesion PHP është një mënyrë për të ruajtur informacionin në variablat e sesionit që mund të përdoret për vërtetim në shumë faqe ueb. Ndryshe nga cookies, informacioni i sesionit nuk ruhet në kompjuterin e përdoruesit. Në vend të kësaj, sesioni krijon një skedar në server në një direktori të përkohshme.
Ky informacion, i ruajtur gjatë gjithë sesionit, është i disponueshëm për të gjitha faqet e internetit të burimit. Në server, vendndodhja e skedarit të përkohshëm përcaktohet nga parametri session.save_path në skedarin e konfigurimit php.ini.
Kur krijoni një sesion PHP, kryhen tre hapat e mëposhtëm:
Këto cilësime ndihmojnë skriptin PHP të marrë vlerat e variablave të sesionit nga skedari. Në anën e klientit, PHPSESSID përmban identifikuesin e sesionit. Ai konfirmon emrin e skedarit që do të kërkohet në një direktori të caktuar në anën e serverit, nga i cili variablat e sesionit mund të nxirren dhe përdoren për verifikim.
Përdoruesi mund ta përfundojë seancën duke klikuar butonin e daljes, i cili thërret funksionin session_destroy(). Kur përdoruesi mbyll shfletuesin, sesioni PHP mbyllet automatikisht. Përndryshe, serveri do të përfundojë seancën pas periudhës së caktuar kohore.
Kur PHP autorizon përmes një sesioni, ai krijohet duke përdorur funksionin session_start() dhe fshihet duke përdorur funksionin session_destroy(). Globale Ndryshore PHP, i njohur si $_SESSION, përdoret për të vendosur vlerat e variablave të sesionit. Ju mund të rivendosni të gjitha vlerat e vendosura për variablat e sesionit duke përdorur funksionin session_unset().
Ne do të shikojmë operacionet e mëposhtme duke përdorur një sesion PHP, si dhe shembuj të tyre.
Rezultati: Ekzekutimi i kodit PHP të mësipërm në server do të prodhojë mesazhin e mëposhtëm:
Rezultati: Kur ekzekutojmë kodin e mësipërm PHP në server, do të marrim mesazhin e mëposhtëm si rezultat. Shfaqen vlerat e variablave të sesionit që kemi vendosur më herët pas krijimit të seancës PHP.
Ju mund të printoni një grup variablash të sesionit dhe vlerat e tyre duke përdorur funksionin print_r($ _SESSION), siç tregohet më poshtë:
Rezultati: Kur të ekzekutojmë kodin e mësipërm PHP në server, do të marrim mesazhin e mëposhtëm. Ai do të përmbajë një sërë variablash sesionesh me vlerat e tyre të reja.
Keni nevojë për një emër përdoruesi dhe fjalëkalim?
Për të dërguar artikuj në internet dhe për të kontrolluar statusin e artikujve të dorëzuar, duhet të regjistroheni dhe të identifikoheni në llogarinë tuaj.
Si pjesë e procesit të paraqitjes së artikujve, autorët duhet të kontrollojnë nëse artikulli i tyre plotëson të gjitha pikat e mëposhtme, mund t'u kthehen autorëve nëse ata nuk i plotësojnë këto kërkesa.
Artikulli është përgatitur në përputhje me kërkesat
Autorët ruajnë të drejtën e autorit të veprës dhe i japin revistës të drejtat e botimit të parë së bashku me veprën, ndërsa e licencojnë atë sipas kushteve të Creative Commons Attribution License, e cila u lejon të tjerëve të rishpërndajnë kjo pune me shënim të detyrueshëm të autorësisë së kësaj vepre dhe një lidhje me botimin origjinal në këtë revistë.
Emrat dhe adresat Email, e futur në faqen e internetit të kësaj reviste do të përdoret vetëm për qëllimet e përcaktuara nga kjo revistë dhe nuk do të përdoret për asnjë qëllim tjetër ose nuk do t'u jepet personave apo organizatave të tjera.
Përpara regjistrimit në sistem, përdoruesi pajtohet me politikën për përpunimin dhe ruajtjen e të dhënave personale.
1500 karaktere me hapësira: 300.00 (RUB)
Botimi i 1 faqe të dorëshkrimit (1500 karaktere) - 300 rubla. Materialet / tabelat grafike paguhen veçmas - 50 rubla / 1 copë. Kopja e autorit, përfshirë transportin brenda Rusisë, paguhet me kërkesë të autorit - 400 rubla. Transporti jashtë vendit - 800 rubla. Kostoja e dërgimit të një certifikate të pranimit të materialit për botim është 150 rubla.
Përkthimi i informacionit shoqërues (emri i plotë, vendi i punës së autorëve; titulli; abstrakt; fjalë kyçe) në gjuhe angleze 0,5 rubla për çdo karakter, duke përfshirë hapësirat.
Kujdes! Autorët (kandidatët dhe doktorët e shkencave) të cilët, sipas elibrary.ru, kanë 300 ose më shumë citate (pjesa e vetë-citimeve nuk duhet të jetë më shumë se 30%) publikohen pa pagesë. Nëse keni të drejtë për publikim falas, kur dërgoni materialin, në fushën e komenteve, tregoni një lidhje me profilin tuaj të bibliotekës me numrin e citimeve. Kostot e transportit për grumbullimin paguhen veçmas.
Sesionet në PHP janë një mekanizëm për ruajtjen e informacionit në lidhje me kompjuterin e klientit në anën e serverit. Në fakt, seancat në PHP nuk janë një temë kaq komplekse, por për ta kuptuar atë duhet të dini se si funksionojnë cookies në PHP. Pra, nëse nuk e dini se si funksionojnë cookies në PHP, atëherë lexoni fillimisht artikullin përkatës dhe më pas kthehuni këtu.
Fjala sesion është përkthyer nga anglishtja si sesion, kështu që vetë kuptimi i sesioneve në PHP bëhet më i qartë, por programuesit kanë adoptuar termin "sesione" dhe ne do ta përdorim atë në këtë artikull.
Sesionet në PHP janë shumë të ngjashme me mekanizmin e cookie-ve, të njëjtat çifte të vlerave të çelësit =>, vetëm ato ruhen në anën e serverit.
Ne duhet të fillojmë seancën, për këtë ekziston funksioni session_start(). Ky funksion fillon një sesion, ose sesion, sido që dëshironi ta quani.
Këshillohet që të thërrisni funksionin session_start() në fillim të faqes, por në shembujt e mi nuk e bëj këtë.
Sesionet janë grupe variablash që ruhen në server, por i referohen një vizitori unik. Përsëri, kjo është pika kryesore: seancat ruhen në server.
Për të siguruar ndërveprimin e çdo vizitori me të dhënat e tij nga sesioni i tij, ne përdorim biskotë, komanda për të krijuar të cilën PHP e jep vetë, nuk keni nevojë të shqetësoheni për të. Kjo cookie është e rëndësishme vetëm për serverin dhe nuk mund të përdoret për të marrë të dhënat e përdoruesit.
Në server, të dhënat e sesionit ruhen në një skedar teksti dhe janë të disponueshme në programin PHP në grupin $_SESSION. Për të ruajtur një ndryshore në një seancë, duhet t'i caktoni një vlerë në këtë grup.
Më në fund le të fillojmë të përdorim shembuj. Gjithçka është shumë e thjeshtë.
Tani le të përpiqemi të marrim vlerën nga grupi $_SESSION në një shembull tjetër.
Ju lutemi vini re se nëse në shembullin e dytë heqim funksionin session_start(), atëherë nuk do të kemi akses në të dhënat në grupin $_SESSION.
Pasi të krijohet një sesion, ju automatikisht keni akses në identifikuesin unik të sesionit duke përdorur funksionin session_id(). Ky funksion ju lejon të vendosni dhe të merrni vlerën e ID-së së sesionit.
Mund të shikoni në shiritin e veglave të zhvilluesit të shfletuesit tuaj (në Chrome, shtypni Ctrl + Shift + I, më pas Burimet dhe do të gjeni një cookie atje), ky domen ka vendosur një cookie për shfletuesin tuaj me emrin PHPSESSID dhe afërsisht sa vijon vlera: “7g5df9rkd1hhvr33lq1k6c72p7”.
Është me vlerën PHPSESSID që serveri do të përcaktojë shfletuesin tuaj dhe do të punojë me grupin përkatës të variablave që do të jenë në dispozicion të skriptit përmes grupit $_SESSION, siç është shkruar më parë.
Ndërsa funksioni session_id() ju lejon të merrni vlerën e ID-së së sesionit, funksioni session_em() ju lejon të merrni emrin e sesionit.
Tani dimë më shumë se si funksionojnë sesionet në PHP dhe duhet të kthehemi edhe një herë te funksioni session_start(). Ky funksion inicializon mekanizmin e sesionit për përdoruesin aktual. Si ndodh saktësisht kjo:
Tani do të shikojmë një shembull që do të na lejojë të kryejmë eksperimente të vogla me seanca.
Ju keni hapur një faqe në sesionin aktual=$_SESSION["count"]?>një herë.
Hapni shembullin në "> këtë skedë.
E gjithë puna e sesionit bazohet në grupin $_SESSION, kjo është qartë e dukshme në këtë shembull.
Nëse mbyllni dritaren e shfletuesit, seanca do të përfundojë dhe numëruesi ynë do të rivendoset në zero. Kjo sjellje e sesioneve në PHP mund të ndryshohet, ne do t'i kthehemi kësaj çështje pak më vonë në artikull.
Për të përfunduar seancën na duhen:
Ju mund të pastroni grupin $_SESSION duke përdorur funksionin session_unset().
Funksioni session_destroy() fshin ruajtjen e përkohshme në server. Meqë ra fjala, ajo nuk bën asgjë tjetër.
Ju duhet të fshini një cookie sesioni duke përdorur funksionin setcookie(), të cilin e mësuam në mësimin mbi punën me cookies në PHP.
Shembull i përfundimit të një seance:
Seanca ka përfunduar.
Tani mund të kryeni një eksperiment: ekzekutoni një shembull me një numërues në një dritare, rrisni numëruesin dhe më pas ekzekutoni shembullin me fshirjen e seancës dhe rifreskoni faqen me numërues përsëri.
Ju mund të fshini një skedar cookie si ky:
setcookie(emri_sesionit(), "", koha() - 60*60*24*32, "/")
Funksionet session_name() dhe session_id() përdoren rrallë në praktikë, por unë po shkruaj për to sepse artikulli duhet të zbulojë vetë mekanizmin se si funksionojnë sesionet në PHP.
Ju mund t'i përdorni këto funksione për të përcaktuar emrat dhe ID-të e sesioneve tuaja, por kjo nuk rekomandohet. Nëse dëshironi t'i vendosni ato, atëherë shkruani këto funksione me argumente përpara funksionit session_start(), si në shembullin më poshtë:
Duke përdorur këtë shembull, të gjithë përdoruesve do t'u caktohet i njëjti ID i sesionit.
Le të hedhim një vështrim më të afërt këtu: nëse e ekzekutoni shembullin nga seksioni rreth funksionit session_name() (këtu është lidhja) në shfletues të ndryshëm (për shembull, Chrome dhe Internet Explorer), atëherë çdo shfletues do të ketë identifikuesin e tij unik të sesionit . Shfletuesit ruajnë kuki secili në dosjen e tyre, kështu që funksioni session_start() do të lejojë çdo shfletues të krijojë identifikuesin e tij unik dhe, në përputhje me rrethanat, një hapësirë ruajtëse unike do të krijohet për çdo shfletues në server. Prandaj, shembulli kundër (ky) do të funksionojë në mënyrë të pavarur në çdo shfletues.
Nëse vendosni të njëjtën ID të sesionit për të gjithë përdoruesit, atëherë ata do të punojnë me të njëjtën hapësirë ruajtëse në server. Këtu është një shembull i një numëruesi që do të numërojë vizitat nga shfletues të ndryshëm:
100) ( session_unset(); session_destroy(); ) ?>
Hapi faqen në shfletues të ndryshëm=$_SESSION["count"]?>një herë.
Hapni shembullin në "> këtë skedë.
Nëse e përdorni këtë shembull, nuk është fakt që do të shihni një të tillë atje. Vizitorë të tjerë mund të kenë ndryshuar tashmë vlerat në dyqanin e sesioneve në server. Nuk e di kur serveri fshin hapësirën ruajtëse në këtë rast, kështu që nëse numëruesi tejkalon 100, unë do ta mbyll seancën.
Si parazgjedhje, seanca "live" derisa vizitori të mbyllë dritaren e shfletuesit. Kjo për faktin se funksioni session_start() vendos një cookie të tillë në klient.
Jetëgjatësia e sesionit mund të ndryshohet duke përdorur funksionin session_set_cookie_params(), këtu është sintaksa e tij.
session_set_cookie_params (jeta int [, shtegu i vargut [, domeni i vargut [, bool i sigurt]]])
Në praktikë, mjafton të përdorni vetëm parametrin e parë (jetën), këtu shkruani kohën në sekonda, e cila përcakton se sa kohë serveri duhet të mbajë mend gjendjen e sesionit pas mbylljes së shfletuesit.
Efekti i funksionit session_set_cookie_params() zbatohet vetëm për periudhën që skripti po ekzekutohet.
Këtu është një shembull i përdorimit të këtij funksioni:
Kundërvlera:=$_SESSION["count"]?>.
Hapni numëruesin në "> këtë skedë.
Mbyllni sportelin dhe mbyllni shfletuesin, pas 30 sekondash hapeni përsëri këtë shembull. Sesioni juaj do të ruhet.
Sesionet në PHP ose si të dhëna për një përdorues ose klient që viziton një sajt ruhen kur lëvizni midis faqeve të një sajti pa shumë vështirësi. Mësimi është shumë i rëndësishëm. E rëndësishme për krijimin e 95% të faqeve të internetit.
Shembull pune
1.
Përdoruesi vendos hyrjen dhe fjalëkalimin e tij dhe hyn në faqe
2.
Të dhënat me hyrje dhe fjalëkalim ruhen në një sesion të njërës prej faqeve të faqes:
Skedari indeks.php
Fillimi_sesionit(); // çdo skedar në të cilin dëshironi të përdorni të dhënat e sesionit duhet të përmbajë një komandë "start sesion" në fillim të kodit
$login = "admin";
$password = "kalim";
$_SESSION["login"] = $login; // ruaj një variabël që përmban hyrje
$_SESSION["fjalëkalim"] = $fjalëkalim; // ruaj një variabël që përmban fjalëkalimin
3. Kur shkoni në një faqe tjetër të sajtit, këto të dhëna do të jenë gjithashtu të disponueshme:
Skedari shembull.php(ose ndonjë faqe tjetër)
Echo "Identifikimi juaj ".$_SESSION["login"]; // do të shfaqë "Hyrja juaj është admin", megjithëse nuk kemi regjistruar asnjë të dhënë në këtë faqe!
Shihni, është e thjeshtë!
4. Nëse dëshironi të pastroni të dhënat e sesionit, atëherë gjithçka që duhet të bëni është:
Skedari shembull.php
Fillimi_sesionit(); // "fillo seancën" përsëri
Unset($_SESSION["identifikimi"]); // kështu ndryshorja u çregjistrua ose u "shkatërrua"
echo "Identifikimi juaj ".$_SESSION["login"]; // do të shfaqë "Identifikimi juaj". Meqenëse e kemi shkatërruar në rreshtin e fundit, nuk ka të dhëna
Session_shkatërrim(); // shkatërroni seancën. Të gjitha të dhënat, duke përfshirë $_SESSION["password"] nuk janë më aty. Kur i kërkoni ato, do të shfaqet një gabim
Në përgjithësi, një transferim i tillë është i ngjashëm me metodën POST, por nuk keni më nevojë të shkruani shumë kode të panevojshme, dhe të gjitha të dhënat e transferuara nga faqja në faqe ruhen në skedarë të përkohshëm në server. E përsëris, seancat duhet të përmbajnë sasi të vogla të dhënash, kështu që ato janë të përshtatshme për ruajtjen e hyrjes/fjalëkalimit, karrocat e blerjeve dhe vëllime të tjera të vogla.
Ne përsëri përdorim një faqe fillestare të caktuar indeks.php
Fillimi_sesionit();
$r = grup ("një", "dy", "tre");
$_SESSION["arr"] = $r;
Në faqen ku do të shfaqet gjithçka
Ne i ruajmë të dhënat në seancë dhe ndjekim lidhjen në një faqe tjetër, ku do të shfaqim të gjitha të dhënat.
Skedari i destinacionit, faqe test.php ku hapim grupin
Fillimi_sesionit();
print_r($_SESSION["arr"]);
// do të printojë
/*
Array
=> një
=> dy
=> tre
*/
?>
Ju mund të dëshironi të rifilloni mësimin në . Në përgjithësi, gjithçka duhet të jetë e qartë.
Lista e funksioneve për të punuar me sesione në php
session_cache_expire - kthen skadimin e cache-it aktual
session_cache_limiter - Merr dhe/ose vendos kufizuesin aktual të cache-it
session_commit është një pseudonim për session_write_close()
session_decode - deshifron të dhënat e sesionit nga një varg
session_destroy - shkatërron të gjitha të dhënat e regjistruara për seancën
session_encode - kodon të dhënat aktuale të sesionit si një varg
session_get_cookie_params - merr parametrat e kukive të sesionit
session_id - merr dhe/ose vendos ID-në e sesionit aktual
session_is_registered - përcakton nëse ndryshorja është e regjistruar në seancë
session_module_name - merr dhe/ose vendos modulin aktual të sesionit
Emri_sesionit - merr dhe/ose vendos emrin e sesionit aktual
session_regenerate_id - modifikon ID-në e sesionit aktual me një të krijuar rishtazi
session_register - regjistron një ose më shumë variabla për sesionin aktual
session_save_path - merr dhe/ose cakton shtegun për të ruajtur sesionin aktual
session_set_cookie_params - vendos parametrat e kukive të sesionit
session_set_save_handler - vendos funksionet e ruajtjes së sesioneve të nivelit të përdoruesit
sesion_fillimi - inicializon të dhënat e sesionit
session_unregister - çregjistron një variabël nga sesioni aktual
session_unset - lëshon të gjitha variablat e sesionit
session_write_close - shkruan të dhënat e sesionit dhe fundin e sesionit
Numri i vizitave në një faqe brenda një seance
// Një shembull i thjeshtë i përdorimit të seancave pa Cookies.
emri i sesionit ("test");
sesioni_fillimi ();
$_SESSION["count"] = @$_SESSION["count"] + 1;
?>
Faleminderit per vemendjen! Fat i mirë në përpjekjet tuaja!