Neştər altında PHP seansları. PHP seansları içəridən necə işləyir

Artıq bildiyiniz kimi, HTTP protokolu veb proqramlara "sessiyalar" qurmağa imkan verir - müştəri və server arasında dialoq və bu dialoqun vəziyyəti sorğudan sorğuya qədər saxlanılır.

PHP dili, ilk növbədə veb proqramlaşdırma üçün bir dil olmaqla, sessiya məlumatlarını təşkil edərkən və saxlayarkən ən çox narahatlığı öz üzərinə götürərək HTTP sessiya mexanizmindən istifadə etmək imkanı verir. HTTP sessiya mexanizminin işləməsi üçün nəyin lazım olduğunu sizə xatırlatmağa icazə verin:

  • Server unikal sessiya nömrəsi yaratmalıdır.
  • Sessiya nömrəsi müştəriyə ötürülməlidir (adətən kukilər vasitəsilə).
  • Server seans məlumatlarını fayllarda və ya verilənlər bazasında saxlaya bilməlidir ki, müştərinin sonrakı sorğularda (həmçinin kukilər vasitəsilə) serverə göndərdiyi sessiya nömrəsini bilməklə bərpa olunsun.

Əslində, seans mexanizminin dişlilərinin fırlanmağa başlaması üçün PHP proqramında görülməli olan yeganə hərəkət tək funksiyanı çağırmaqdır: session_start(). Bu funksiya bütün lazımi işləri görür:

  • Müştərinin Kuki-də və ya sorğu parametrlərində artıq mövcud sessiya nömrəsini göndərib-göndərmədiyini yoxlayır. Əgər müştəri seans nömrəsi göndəribsə, onda bu sessiya üçün məlumatlar daimi saxlama yerindən (məsələn, fayldan) yaddaşa yüklənir və $_SESSION massivi vasitəsilə proqram üçün əlçatan olur. Müştəri sessiya nömrəsini göndərməyibsə və ya serverdə belə bir seans yoxdursa, yeni nömrə ilə yeni sessiya yaradılır və onun məlumatları yeni sessiya vəziyyətində $_SESSION massivi vasitəsilə də əldə edilə bilər. boş olacaq. Yeni yaradılmış sessiya nömrəsi Set-Cookie server cavabının başlıq sahəsinə yerləşdirilir.
  • Sessiya məlumatlarının saxlanmasını təmin edir. PHP proqramı sorğunu emal etdikdən sonra $_SESSION massivinin cari vəziyyəti daimi saxlama yerində saxlanılır ki, müştəri növbəti dəfə sorğu göndərəndə yenidən əlçatan olsun.

İndi biz session_start() ın arxasındakı təfərrüatları bildiyimiz üçün bu mexanizmlə oynaya bilərik. Aşağıdakı misal sessiyada hər bir müştəri sorğusu ilə bir ədəd artıran tək nömrəni saxlayır:

Bu səhifəni ilk dəfə ziyarət etdiyiniz zaman server brauzerə sessiya nömrəsi ilə kuki göndərəcək:

Set-Cookie: PHPSESSID=4ftvca7jmmnm04q95r3sdsk6r6; yol=/

Brauzer hər növbəti sorğu ilə eyni sessiya nömrəsini serverə geri göndərəcək. İndi brauzerinizdə kukiləri təmizləsəniz, serverdə fərqli nömrə ilə yeni sessiya yaradılacaq və test skriptimizdə hesablama yenidən başlayacaq.

Daha real nümunə: istifadəçi girişi

Çox vaxt seanslar istifadəçi vebsayta daxil olduqda istifadə olunur. Sayta daxil olarkən istifadəçi server tərəfindən təsdiqlənən login və parol daxil edir. Giriş düzgündürsə, server yenidən giriş və şifrə tələb etməmək üçün sessiyada istifadəçi məlumatlarını yadda saxlamalıdır. Ən sadə halda, bu bir nümunə olardı:

massiv("parol" => "123", "başlıq" => "İdarəçi",), "istifadəçi" => massiv("parol" => "qwe", "başlıq" => "İstifadəçi",),) ; isset($users[$login]) qaytarılsın? $users[$login]: null; ) funksiya getCurrentUser() ( $user = isset($_SESSION["user"])? $_SESSION["user"]: null; return $user; ) funksiya setCurrentUser($user) ( $_SESSION["user"] = $user ?>

Salam,!
Link1 Link2

Çölə çıxmaqSiz hələ sayta daxil olmamısınız. Giriş və parol daxil edin:
Daxil ol: Şifrə:

Bu proqram login və parol tələb edir və siz öz girişinizlə daxil ola bilərsiniz istifadəçi, qwe və ya admin, 123 . Daxil olan istifadəçiyə salamlama göstərilir. Daxil olan zaman istifadəçi adı və ya parol səhv olarsa, mesaj göstərilir.

Bu “sayt”a daxil olmağı bacardıqdan sonra, daxil olmuş istifadəçi olaraq, linklərə (Link1, Link2) klikləyə bilərsiniz.

Sessiyada hansı məlumatları saxlamaq olar?

Varsayılan olaraq, PHP sessiya məlumatlarını mətn kimi müvəqqəti faylda saxlayır. Bunu müvəqqəti PHP faylları olan qovluğa baxaraq yoxlaya bilərsiniz. Bu kataloq phpinfo()-da Environment, TEMP bölməsində göstərilmişdir. Bu qovluqda siz sess_ kimi faylları tapa bilərsiniz. 4ftvca7jmmnm04q95r3sdsk6r6, burada 4ftvca7jmmnm04q95r3sdsk6r6 Kukiyə ötürülən sessiya nömrəsidir. Bu fayla nəzər salın: əgər yuxarıdakı ilk nümunəni işlətmisinizsə, onda faylda belə bir şey olacaq: “value|i:2;”. Bu mətn yalnız bir dəyişəni nömrə ilə saxlayan sessiya məzmununun seriyalı təsviridir.

PHP proqramının $_SESSION massivi vasitəsilə seansa daxil etdiyi bütün dəyərlər sessiya saxlanarkən mətnə ​​çevrilir və sonra fayla yazılır. Dəyişən dəyərlərin mətnə ​​çevrilməsi prosesi "seriyalaşdırma" adlanır. Beləliklə, siz PHP-nin seriallaşdıra bildiyi istənilən məlumatları sessiyaya yerləşdirə bilərsiniz.

Xoşbəxtlikdən, PHP-də siz təkcə rəqəmlər və sətirlər kimi sadə dəyərləri deyil, həm də massivlər və obyektlər kimi mürəkkəb strukturları seriallaşdıra bilərsiniz:

"; print_r($_SESSION); echo ""; $_SESSION["testArray"] = massiv(1, 2, 3, "bir", "iki", "üç", "uşaq" => massiv(5, 6, 7),); $obj = yeni stdClass(); $obj->y = 4567["testObject"] = $obj;

Bu nümunə aşağıdakı məlumatları sessiya faylına yazacaq:

TestArray|a:7:(i:0;i:1;i:1;i:2;i:2;i:3;i:3;s:3:"bir";i:4;s:3 :"iki";i:5;s:5:"üç";s:5:"uşaq";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;)

Obyektlərin sessiyada saxlanması

Gördüyünüz kimi, bir sessiyada obyektləri saxlaya bilərsiniz. Ancaq eyni zamanda, yadda saxlamalısınız ki, bir növ sizin “evdə hazırlanmış” siniflərinizə aid olan obyektləri və ya siniflərinizin nümunələri olan obyektləri sessiyada saxlayarkən, bu siniflərin bəyannaməsi session_start( çağırmadan əvvəl edilməlidir. ). Yəni, PHP sessiya məlumatlarını sıradan çıxararkən onun qeydinə rast gəlməzdən əvvəl sinfi bilməlidir.

Obyektləri saxlayarkən, obyektin standart serializasiyasının nədənsə qəbuledilməz və ya tamamilə qeyri-mümkün olduğu vəziyyətlər var. Belə hallarda sinifdə __sleep() və __wakeup() sehrli üsullarını elan etməklə seriallaşdırmanı əl ilə həyata keçirə bilərsiniz.

Yeri gəlmişkən, seriallaşdırma da "əl ilə" edilə bilər və sessiya məlumatlarını saxlamaq/yükləmək lazım deyil. Tətbiqdəki bəzi məlumatların sonradan istifadə üçün saxlanması və ya şəbəkə üzərindən ötürülməsi lazım olduqda bu tələb oluna bilər. Serializasiya/serializasiya üçün faydalı ola biləcək funksiyalar serialize(), unserialize(), json_encode(), json_decode().

Seansda nə saxlanıla bilməz?

Sessiya seriallaşdırıla bilməyən heç bir şeyi saxlaya bilməz. Belə bir quruma misal olaraq istənilən PHP resursu ola bilər. Resurslar şəbəkə əlaqələri, açıq fayl tutacaqları, verilənlər bazası əlaqələri və bəzi digər obyektlərdir. PHP-də resurs proqramdan birbaşa istifadə olunmayan, lakin müxtəlif PHP funksiyalarını çağırmaqla idarə oluna bilən PHP-nin daxili obyektinə istinaddır. Məzmunu seriallaşdırıla bilməyən və edilməməli olan bir növ “qara qutu”.

Əlavə xüsusiyyətlər

PHP tərtibatçıya sessiya məlumatlarını, məsələn, verilənlər bazasında saxlamaq üçün öz üsulunu həyata keçirmək imkanı verir. Bunun üçün daimi saxlama yerindən sessiya məlumatlarını saxlayacaq və yükləyən funksiyaları həyata keçirmək lazımdır. Daha sonra funksiyanı çağıraraq PHP-yə bu funksiyalar haqqında məlumat verməlisiniz session_set_save_handler.

Yüksək yüklənmiş saytlarda sessiya məlumatlarının saxlanması və yüklənməsi prosesini sürətləndirmək üçün məlumatları yaddaşda saxlayan Memcached serverindən istifadə etmək olar. Sessiyaların saxlanmasının bu metoduna dəstək PHP-də qurulub və php.ini konfiqurasiya faylı vasitəsilə konfiqurasiya edilir.

Siz seans nömrəsinin ötürüldüyü Cookie parametrinin adını, onun adını, ömrünü, domenini və digər parametrlərini təyin edə bilərsiniz.

PHP-də HTTP sessiyalarının qurulması üçün bu və bir çox başqa variantları session_* funksiyaları vasitəsilə əldə etmək olar.

//Cari skript üçün sessiya məlumatlarını silin: $_SESSION = ; //idinə uyğun kuki silin: @unset($_COOKIE); //sessiya yaddaşını silin: session_destroy();

Bir sessiyanın silinməsinin niyə 3 mərhələyə bölünməsinin lazım olduğunu başa düşmək üçün onun harada və harada saxlandığını anlayaq.

Aydınlıq üçün bütün növ sessiya məlumatlarının saxlandığı bütün yerləri müəyyən edək:

  1. Superqlobal massiv $_SESSION.
    Sessiya başlanğıcında yaradılmışdır session_start(). Bu yalnız skript dəyişənidir, yalnız skript işləyərkən mövcuddur və serverdə saxlanmır, lakin RAM-da saxlanılır (bu o deməkdir ki, skriptin növbəti icrasından sonra yox olur, yaddaşdan yenidən işə salınır). növbəti dəfə serverə daxil olduqda).

    Koterovdan:

    Skript başa çatdıqda, PHP avtomatik olaraq $_SESSION massivini müvəqqəti yaddaşda saxlayır, adı SID-də saxlanılır.

    massivdən verilənlərin yaddaşa yazılması deməkdir $_SESSION, içində hər hansı varsa.

  2. SID bişirin.
    Sessiya başlanğıcında yaradılmışdır session_start(). Verilmiş istifadəçi üçün sessiya məlumat anbarının yerini saxlayır. O, yalnız kukiləri zorla sildiyiniz halda silinə bilər.
  3. Və nəhayət, Sessiya məlumatlarının saxlanması.
    Session_start() funksiyasını çağırmaqla sessiya başlayanda yaradılır. Yaddaş serverdə (PHP skriptinizin işlədiyi yerdə) yerləşir.
    Massivdən verilənlər ona yazılır $_SESSION, əgər varsa/orada görünür. Məlumat yalnız zəng edildikdə ondan silinir session_destroy().
    Bu yaddaş istifadəçinin növbəti sorğusu cavab aldıqdan sonra da serverdə mövcud olmağa davam edir, yəni. ssenari öz işini başa çatdırdı.

Bunlar. deyə bilərik ki:

  • PHP skriptində siz $_SESSION massivi vasitəsilə sessiya məlumatları ilə işləyə bilərsiniz
  • $_SESSION sessiya mağazası üçün "maska"dır və bu massivə yazmaq mağazaya yazılmaqla nəticələnsə də, serialın silinməsi özü mağazadakı məlumatları məhv etmir.
  • Massivi silməklə, siz yalnız cari skript çağırışında sessiya məlumatlarına girişi itirəcəksiniz, lakin növbətisində yaddaşı əlavə olaraq təmizləməsəniz, yenidən işə salınacaq (küldən qalxacaq).

Beləliklə

Əgər session_destroy()çağırılmayacaq və kukilər silinməyəcək, sonra skript yenidən işə salındıqda, əvvəllər ona yazılmış yaddaşdan məlumatlar görünəcək. $_SESSION, skripti işlədərkən belə, əl ilə daxil edin $_SESSION onları əlavə etməyəcəksiniz.

// Cari skriptdə seans məlumatlarını təmizləmək üçün bu sətri yazırıq $_SESSION = ; //Bu sətir SID silir @unset($_COOKIE); //Sessiya yaddaşını silir: session_destroy();

Əvvəldən PHP səs-küylə qəbul edildi, lakin bu dildə kifayət qədər böyük layihələr yaradılmağa başlayan kimi tərtibatçılar yeni problemlə üzləşdilər - PHP-də qlobal dəyişənlər anlayışı yox idi! Yəni müəyyən bir skript icra edildi, yaradılan səhifə müştəriyə göndərildi və bu skriptin istifadə etdiyi bütün resurslar məhv edildi. Mən təsvir etməyə çalışacağam: bir saytın iki səhifəsi olduğunu düşünək, index.php və dothings.php. Bu səhifələr üçün mənbələr belə görünür:

index.php dothings.php

Bu iki skripti işlədirsək, onda birinci səhifədə “I was assigned to index.php” yazısını görəcəyik, ikinci səhifə isə boş olacaq.

Veb sayt tərtibatçıları, iki dəfə düşünmədən, müştəri tərəfində qlobal dəyişənləri saxlamaq üçün kukilərdən istifadə etməyə başladılar. Proses belə görünürdü: istifadəçi saytın əsas səhifəsinə gəlir, bəzi hərəkətlər edir və bu istifadəçi ilə əlaqəli saytın digər səhifələrində lazım ola biləcək bütün məlumatlar onun brauzerində formada saxlanılacaq. peçenye. Bu metodun kifayət qədər ciddi çatışmazlıqları var, buna görə bir çox tərtibatçı bir anda PHP-dən üz çevirdi. Məsələn, istifadəçiyə saytın şəxsi (və ya şəxsi) bölmələrinə daxil olmasına icazə verməliyik. Siz istifadəçiyə saytda onun sonrakı identifikatoru kimi xidmət edəcək kuki göndərməli olacaqsınız. Sayt istifadəçinin davranışı haqqında getdikcə daha çox məlumat toplamağa başlayan kimi bu yanaşma çox çətin və əlverişsiz olur, çünki istifadəçiyə göndərilən bütün məlumatları saxtalaşdırmamaq üçün kodlaşdırmaq məqsədəuyğundur. Bu yaxınlarda, kukiləri saxtalaşdırmaqla, birdən çox söhbəti "sındırmaq" və bəzən hətta başqasının poçtuna girmək mümkün idi. Bundan əlavə, dünyada hələ də brauzeri kukiləri dəstəkləməyən qəribə insanlar var.

Sessiya mexanizminin texnoloji məsələlərinə girməyəcəyəm, ancaq PHP-də seanslarla düzgün işləməyi təsvir edəcəyəm.

Seanslarla necə işləmək olar?

Məqalədəki nümunələri (yaxud skriptlərinizi) hər hansı kommersiya hostinqində sınaqdan keçirsəniz, sessiyalarla işləməkdə heç bir problem olmamalıdır. Əgər serverinizi özünüz quraşdırırsınızsa (həqiqi server və ya emulyator olsun), bu kimi xətalar görünə bilər:

"Xəbərdarlıq: open(/var/state/php/sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) uğursuz oldu: Belə bir fayl və ya kataloq yoxdur (2)."

Bu, sadəcə olaraq, PHP-nin səhv konfiqurasiya edildiyini bildirir. Siz php.ini faylında seansları saxlamaq və serveri yenidən işə salmaq üçün düzgün yolu (mövcud qovluğa) göstərərək bu problemi həll edə bilərsiniz.

Seanslardan dəyişənlərdən (məlumatlardan) istifadə edəcək hər hansı skript aşağıdakı sətirdən ibarət olmalıdır:

Session_start();

Bu əmr serverə verilən səhifənin müəyyən istifadəçi (brauzer) ilə əlaqəli bütün dəyişənlərə ehtiyacı olduğunu bildirir. Server bu dəyişənləri fayldan götürür və onları əlçatan edir. İstifadəçiyə hər hansı məlumat göndərilməmişdən əvvəl sessiyanın açılması çox vacibdir; praktikada bu o deməkdir ki, səhifənin ən əvvəlində session_start() funksiyasını çağırmaq məsləhətdir, məsələn:

Session_start(); ?> ... Sessiya fayllarının saxlanacağı qovluğu təyin etmək üçün session_save_path() funksiyasından istifadə edin: session_save_path($_SERVER["DOCUMENT_ROOT"]."/session"); session_start();

Sessiya başladıqdan sonra siz qlobal dəyişənləri təyin edə bilərsiniz. $_SESSION massivinin hər hansı sahəsinə hər hansı dəyər təyin edilərkən eyni adlı dəyişən avtomatik olaraq sessiya dəyişəni kimi qeydə alınır. Bu massiv sessiyadan istifadə edən bütün səhifələrdə mövcuddur. Məsələn, proqrama baxaq:

index.php Hər şey qaydasındadır. Sessiya yükləndi! Gəlin keçək və orada nə olduğunu görək:

dothings.php

Bu faylları ardıcıl olaraq işlədərkən, ilk "index.php" skripti aşağıdakı nəticəni verəcəkdir:

Hər şey qaydasındadır. Sessiya yükləndi! Gəlin keçək və orada nə olduğunu görək:

İkinci “dothings.php” isə budur:

Məndən index.php ünvanını istədilər

$a dəyişəni indi seansları işə salmış verilmiş saytın bütün səhifələrində mövcuddur.

Seanslarla işləmək üçün digər faydalı xüsusiyyətlər və texnikalar:

  • ayarlanmadı($_SESSION["a"])- sessiya göstərilən seans dəyişəninin dəyərini “unudur”;
  • session_destroy()- sessiya məhv edildi (məsələn, istifadəçi “çıxış” düyməsini basaraq sistemi tərk edərsə);
  • session_set_cookie_params (int ömrü [, string path [, string domain]])- bu funksiyadan istifadə edərək sessiyanın “ölüm” vaxtını təyin edən unix_timestamp təyin etməklə sessiyanın nə qədər “yaşayacağını” təyin edə bilərsiniz. Varsayılan olaraq, seans müştəri brauzer pəncərəsini bağlayana qədər "canlı" olur.
  • session_write_close()- sessiya dəyişənlərinin qeydə alınması və bağlanması. Səhifənin işlənməsi uzun müddət çəkirsə və brauzeriniz üçün sessiyalar faylını bloklayıbsa, bu, saytı yeni pəncərədə açmaq üçün lazımdır.

Nümunələr

İndi isə keçək sessiya mexanizminin praktiki tətbiqinə. Burada kifayət qədər sadə və eyni zamanda faydalı bir neçə nümunəyə baxacağıq.

İstifadəçi Avtorizasiyası

PHP seanslarından istifadə edərək istifadəçinin avtorizasiyası ilə bağlı suallar daim veb proqramlaşdırma konfranslarında verilir. Sistemdəki istifadəçilərə seanslardan istifadə edərək icazə vermə mexanizmi təhlükəsizlik baxımından kifayət qədər yaxşıdır (bölmə bax).

Nümunəmiz üç fayldan ibarət olacaq: index.php, authorize.php və secretplace.php. index.php faylı istifadəçinin öz istifadəçi adı və şifrəsini daxil edəcəyi formadan ibarətdir. Bu forma məlumatları avtorizasiya.php faylına ötürəcək, əgər avtorizasiya uğurlu olarsa, istifadəçiyə secretplace.php faylına daxil olmaq imkanı verəcək və əks halda səhv mesajı göstərəcək.

Nümunələr: index.php Şifrənizi daxil edin

Daxil ol:
Şifrə:


avtorizasiya.php səhifə... başlıq("Yer: gizli yer.php"); çıxış; ) ) // əgər bir şey səhv olarsa, istifadəçi // xəta mesajı alacaq. ?> Siz səhv parol daxil etmisiniz!

gizli yer.php Salam,, gizli səhifədəsiniz!!! :)

Təhlükəsizlik

Beləliklə, biz identifikatoru bir səhifədən digərinə (PHP skripti) ötürə bilirik (saytımızdan növbəti zəngə qədər), bu o deməkdir ki, biz bütün sayt ziyarətçilərini ayırd edə bilərik. Sessiya identifikatoru çox böyük rəqəm (128 bit) olduğundan, onun kobud qüvvə ilə tapılması şansı praktiki olaraq yoxdur. Beləliklə, təcavüzkarın qarşısında aşağıdakı seçimlər qalır:

  • istifadəçinin kompüterində sessiya nömrələrini oğurlayan troyan var;
  • təcavüzkar istifadəçinin kompüteri ilə server arasında trafikə müdaxilə edir. Əlbəttə ki, təhlükəsiz (şifrələnmiş) SSL protokolu var, lakin hər kəs ondan istifadə etmir;
  • Qonşu istifadəçimizin kompüterinə yaxınlaşaraq sessiya nömrəsini oğurladı.

Kiminsə başqasından nəyisə oğurlamasına əsaslanan belə hallar, ümumiyyətlə, proqramçının səlahiyyətinə aid deyil. Administratorlar və istifadəçilər özləri bununla məşğul olmalıdırlar.

Bununla belə, PHP çox vaxt “aldadıla” bilər. İstifadəçinin icazə proqramında mümkün sındırma nöqtələrinə baxaq:

  • authorize.php faylı üçüncü tərəf skriptindən istifadə edərək parolu təxmin etmək cəhdidir;
  • secretplace.php faylı brauzerin ünvan çubuğuna $logged_user dəyişəninin dəyərlərini daxil etməklə proqramı aldatmaq cəhdidir, məsələn:
    "http://www.yoursite.ru/secretplace.php? logged_user=hacker"

Beləliklə, proqramımızda iki "deşik" aydın görünür, biri kiçikdir və xüsusilə nəzərə çarpmır, lakin ikincisi sadəcə nəhəngdir, bunun vasitəsilə əksər hakerlər etməməli olduqları yerə girirlər.

1 nömrəli dəliyi necə "yamaq" olar?

İP ünvanını bloklamaq üçün tonlarla kod yazmayacağıq və s., sadəcə olaraq sorğunun haradan gəldiyini, daha doğrusu sorğunun hansı səhifədən gəldiyini yoxlayın, əgər saytımızın hər hansı bir səhifəsidirsə, hər şey qaydasındadır, amma bütün digər hallarda sizi içəri buraxmayacağıq. avtorize.php faylını tənzimləyək:

avtorizasiya.php V2 səhifə... başlıq("Yer: gizli yer.php"); çıxış; ))) ?> Siz səhv parol daxil etmisiniz!


2 nömrəli "çuxurdan" necə qurtulmaq olar?

Deyək ki, hər kəsin foruma yazı yazmaq üçün qeydiyyatdan keçə biləcəyi vebsaytınız var. Təbii ki, forumda bəzi istifadəçilər (inzibatçılar, moderatorlar) digər istifadəçilərdən daha çox imkanlara malikdirlər, məsələn, digər istifadəçilərin mesajlarını silə bilərlər; Siz istifadəçinin giriş səviyyəsini sessiyada $user_status dəyişənində saxlayırsınız, burada $user_status = 10 sistemə tam girişə uyğundur. Sayta gələn təcavüzkar sadəcə olaraq adi qaydada qeydiyyatdan keçməli və sonra brauzerin ünvan çubuğuna əlavə etməlidir ?user_status=10. Beləliklə, forumunuzda yeni admin var!

Prinsipcə, hər hansı bir skript dəyişəni ünvan çubuğu vasitəsilə sadəcə sual işarəsi və dəyişənin adını skriptə tam ünvandan sonra dəyəri ilə əlavə etməklə təyin edilə bilər. Bunun qarşısını almaq üçün kodumuzu düzəldək:

gizli yer.php V2 dəyişən təyin edilmədi($_SESSION["logged_user"]); // sessiyanı açın session_start(); /* sadəcə olaraq bu səhifəyə keçə bilməzsiniz... əgər istifadəçi adı qeydiyyatdan keçməyibsə, onda login və şifrəni daxil etmək üçün onu index.php səhifəsinə yönləndiririk... burada əslində çox şey edə bilərsiniz, məsələn, istifadəçinin IP-sini xatırlayın və fayllara giriş əldə etmək üçün üçüncü cəhddən sonra onu bloklayın. */ if(!isset($_SESSION["logged_user"]))( header("Yer: index.php"); exit; ) ?> Salam,, gizli səhifədəsiniz!

Nəticələr

Sessiya mexanizmi PHP dilinin olduqca yaxşı xüsusiyyətidir. Sessiyalar sadədir və istifadəsi çox çevikdir. Yeri gəlmişkən, PHP sessiyalarının bir, kiçik sənədləşdirilmiş xüsusiyyəti var (versiya 4.0.3-dən başlayaraq mövcuddur) - sessiyalarda siz təkcə dəyişənləri deyil, həm də obyektləri saxlaya bilərsiniz.

Nümunələr

?>
// Linklərə avtomatik olaraq SID daxil edin. ini_set("session.use_trans_sid", doğru); session_start(); ?> Bura basın!
Bura basın!!



// Seanslarla işləmək nümunəsi. session_start(); // Əgər sayta yeni daxil olmusunuzsa, sayğacı sıfırlayın. əgər (!isset($_SESSION["count"])) $_SESSION["count"] = 0; //Seansda sayğacı artırın. $_SESSION["count"] = $_SESSION["count"] + 1; ?>

Sayğac

vaxt(lar).
Sayğacı sıfırlamaq üçün brauzerinizi bağlayın.
" target="_blank"> Uşaq brauzer pəncərəsini açın.
// Kukilər olmadan sessiyalardan istifadənin sadə nümunəsi. sessiya_adı ("test"); session_start(); $_SESSION["count"] = @$_SESSION["count"] + 1; ?>

Sayğac

Siz bu səhifəni cari brauzer sessiyanızda açdınızvaxt(lar).
Bu sayğacı sıfırlamaq üçün brauzerinizi bağlayın.
?">Səhifəni yeniləmək üçün bura klikləyin!

PHP-də seanslar server tərəfində müştərinin kompüteri haqqında məlumatların saxlanması mexanizmidir. Əslində, PHP-də seanslar o qədər də mürəkkəb mövzu deyil, lakin bunu başa düşmək üçün PHP-də kukilərin necə işlədiyini bilmək lazımdır. Beləliklə, PHP-də kukilərin necə işlədiyini bilmirsinizsə, əvvəlcə müvafiq məqaləni oxuyun və sonra buraya qayıdın.

Sessiya sözü ingilis dilindən sessiya kimi tərcümə olunur, ona görə də PHP-də sessiyaların mənası daha aydın olur, lakin proqramçılar “sessiyalar” terminini qəbul ediblər və biz bu məqalədə ondan istifadə edəcəyik.

PHP-də seanslar kuki mexanizminə çox oxşardır, eyni açar => dəyər cütləri, yalnız server tərəfində saxlanılır.

session_start() funksiyası

Biz sessiyaya başlamalıyıq, bunun üçün session_start() funksiyası var. Bu funksiya siz onu çağırmaq istədiyiniz seansa və ya sessiyaya başlayır.

Səhifənin ən əvvəlində session_start() funksiyasını çağırmaq məsləhətdir, amma nümunələrimdə bunu etmirəm.

$_SESSION massivi

Sessiyalar serverdə saxlanılan, lakin bir unikal ziyarətçi ilə əlaqəli dəyişənlər qruplarıdır. Yenə də əsas məqam budur: seanslar serverdə saxlanılır.

Hər bir ziyarətçinin öz sessiyasındakı məlumatları ilə qarşılıqlı əlaqədə olmasını təmin etmək üçün PHP-nin özünə verdiyi yaratmaq əmri olan kuki istifadə olunur, bu barədə narahat olmaq lazım deyil. Bu kuki yalnız serverə aiddir və istifadəçi məlumatlarını əldə etmək üçün istifadə edilə bilməz.

Serverdə sessiya məlumatları mətn faylında saxlanılır və PHP proqramında $_SESSION massivində mövcuddur. Seansda dəyişəni saxlamaq üçün ona bu massivdə dəyər təyin etməlisiniz.

Nəhayət nümunələrdən istifadə etməyə başlayaq. Hər şey çox sadədir.

PHP-də sessiyalar mənası."; ?>

İndi başqa misalda $_SESSION massivindən dəyəri almağa çalışaq.

PHP-də sessiyalar

Nəzərə alın ki, əgər ikinci misalda session_start() funksiyasını silsək, onda bizim $_SESSION massivindəki məlumatlara çıxışımız olmayacaq.

session_id() funksiyası

Sessiya yaradıldıqdan sonra siz session_id() funksiyasından istifadə edərək avtomatik olaraq sessiyanın unikal identifikatoruna daxil olursunuz. Bu funksiya həm sessiya ID dəyərini təyin etməyə, həm də əldə etməyə imkan verir.

PHP-də sessiyalar

Siz brauzerinizin tərtibatçı alətlər panelinə baxa bilərsiniz (Chrome-da Ctrl + Shift + I, sonra Resurslar düymələrini basın və orada kuki tapacaqsınız), bu domen brauzeriniz üçün PHPSESSID adlı kuki təyin edib və təxminən aşağıdakılar dəyər: “7g5df9rkd1hhvr33lq1k6c72p7”.

Məhz PHPSESSID dəyərinə görə server brauzerinizi təyin edəcək və əvvəllər yazıldığı kimi $_SESSION massivi vasitəsilə skript üçün əlçatan olacaq uyğun dəyişənlər dəsti ilə işləyəcək.

session_name() funksiyası

session_id() funksiyası sessiya identifikatoru dəyərini əldə etməyə imkan verdiyi halda, session_name() funksiyası sessiya adını əldə etməyə imkan verir.

PHP-də sessiyalar

Bir daha session_start() funksiyası haqqında

İndi biz PHP-də seansların necə işlədiyini daha çox bilirik və bir daha session_start() funksiyasına qayıtmalıyıq. Bu funksiya cari istifadəçi üçün sessiya mexanizmini işə salır. Bu tam olaraq necə baş verir:

  • Əgər istifadəçi saytı ilk dəfə işə salıbsa, onda session_start() müştəridə kuki təyin edir və istifadəçi ID ilə əlaqəli serverdə müvəqqəti yaddaş yaradır.
  • Daxil edilmiş cari ID ilə əlaqəli mağazanı müəyyənləşdirir.
  • Serverdə yaddaşda verilənlər varsa, o, $_SESSION massivində yerləşdirilir.
  • Php.ini faylından register_globals Aktivdirsə, $_SESSION massivinin bütün elementləri qlobal dəyişənlərə çevrilir.

Sessiyadan istifadə nümunəsi

İndi seanslarla kiçik təcrübələr aparmağa imkan verəcək bir nümunəyə baxacağıq.

PHP-də sessiyalar

Sayğac

Siz cari sessiyada səhifə açdınızbir dəfə.

Nümunəni ">bu tabda açın.

Bütün sessiya işləri $_SESSION massivinə əsaslanır, bu, bu nümunədə aydın görünür.

Brauzer pəncərəsini bağlasanız, sessiya bitəcək və sayğacımız sıfıra endiriləcək. PHP-də seansların bu davranışı dəyişdirilə bilər, məqalədə bir az sonra bu məsələyə qayıdacağıq.

Sessiyanı bitirmək

Sessiyanı bitirmək üçün bizə lazımdır:

  1. $_SESSION massivini təmizləyin.
  2. Serverdəki müvəqqəti yaddaşı silin.
  3. Sessiya kukilərini silin.

Siz session_unset() funksiyasından istifadə edərək $_SESSION massivini təmizləyə bilərsiniz.

session_destroy() funksiyası serverdəki müvəqqəti yaddaşı silir. Yeri gəlmişkən, o, başqa heç nə etmir.

PHP-də kukilərlə işləmək dərsində öyrəndiyimiz setcookie() funksiyasından istifadə edərək sessiya kukisini silməlisiniz.

Sessiyanı bitirmə nümunəsi:

Sessiyanı bitirmək

Sessiya başa çatdı.

İndi bir sınaq keçirə bilərsiniz: bir pəncərədə sayğac ilə bir nümunə işlədin, sayğacı artırın və sonra sessiyanı silməklə nümunəni işə salın və səhifəni sayğacla yenidən yeniləyin.

Kuki faylını belə silə bilərsiniz:

setcookie(sessiya_adı(), "", vaxt() - 60*60*24*32, "/")

Bir daha session_name() və session_id() funksiyaları haqqında

Session_name() və session_id() funksiyaları praktikada nadir hallarda istifadə olunur, lakin mən onlar haqqında yazıram, çünki məqalədə PHP-də seansların necə işləməsinin mexanizmini açıqlamaq lazımdır.

Siz öz sessiya adlarınızı və identifikatorlarınızı təyin etmək üçün bu funksiyalardan istifadə edə bilərsiniz, lakin bu tövsiyə edilmir. Əgər siz onları təyin etmək istəyirsinizsə, aşağıdakı nümunədə olduğu kimi bu funksiyaları session_start() funksiyasından əvvəl arqumentlərlə yazın:

PHP-də sessiyalar

Bu nümunədən istifadə edərək, bütün istifadəçilərə eyni sessiya ID-si təyin ediləcək.

Gəlin burada daha yaxından nəzər salaq: əgər siz müxtəlif brauzerlərdə (məsələn, Chrome və Internet Explorer) session_name() funksiyası haqqında bölmədən nümunə işlədirsinizsə (burada link var), onda hər bir brauzerin özünəməxsus sessiya identifikatoru olacaq. . Brauzerlər kukiləri hər biri öz qovluğunda saxlayır, ona görə də session_start() funksiyası hər bir brauzerə öz unikal identifikatorunu yaratmağa imkan verəcək və müvafiq olaraq serverdə hər bir brauzer üçün unikal yaddaş yaradılacaq. Buna görə də, əks nümunə (bu) hər bir brauzerdə müstəqil işləyəcək.

Bütün istifadəçilər üçün eyni sessiya identifikatorunu təyin etsəniz, onlar serverdə eyni yaddaşla işləyəcəklər. Müxtəlif brauzerlərdən gələn ziyarətləri sayacaq sayğac nümunəsi:

100) ( session_unset(); session_destroy(); ) ?> PHP-də sessiyalar

Sayğac № 2

Səhifəni müxtəlif brauzerlərdə açdıbir dəfə.

Nümunəni ">bu tabda açın.

Bu nümunəni işlətsəniz, orada birini görəcəyiniz fakt deyil. Digər ziyarətçilər serverdəki sessiya mağazasındakı dəyərləri artıq dəyişdirmiş ola bilərlər. Bu halda serverin yaddaşı nə vaxt siləcəyini bilmirəm, buna görə də sayğac 100-ü keçərsə, sessiyanı bitirəcəyəm.

Gözləmə vaxtının təyin edilməsi

Varsayılan olaraq, ziyarətçi brauzer pəncərəsini bağlayana qədər sessiya "canlı"dır. Bu, session_start() funksiyasının müştəriyə belə kuki yerləşdirməsi ilə əlaqədardır.

Sessiyanın ömrü session_set_cookie_params() funksiyasından istifadə etməklə dəyişdirilə bilər, onun sintaksisi budur.

session_set_cookie_params (int ömrü [, sətir yolu [, string domeni [, bool security]]])

Praktikada yalnız birinci parametrdən (ömür boyu) istifadə etmək kifayətdir, burada siz saniyələrlə vaxtı yazırsınız, bu da serverin brauzeri bağladıqdan sonra sessiya vəziyyətini nə qədər yadda saxlamalı olduğunu müəyyən edir.

session_set_cookie_params() funksiyasının təsiri yalnız skriptin işlədiyi dövrə aiddir.

Bu funksiyadan istifadə nümunəsi:

PHP-də sessiyalar

Sayğac № 3

Sayğac dəyəri:.

Sayğacı ">bu tabda açın.

Sayğacı açın və brauzeri bağlayın, 30 saniyədən sonra bu nümunəni yenidən açın. Sessiyanız yadda saxlanılacaq.



Əlaqədar nəşrlər