• php životnost cookie. Jak se soubory cookie liší od relace v PHP? Cesta úložiště souboru relace

    Páni, pojďme na to.

    Chcete-li začít, přečtěte si o HTTP na stejné wiki. Nepotřebujete to vědět podrobně, ale měli byste minimálně rozumět struktuře požadavků / odpovědí, rozumět tomu, že požadavek a odpověď mají záhlaví a tělo (v závislosti na typu požadavku nemusí být tělo / Odezva).

    Tak. Soubory cookie. Soubory cookie žijí na straně prohlížeče. Jsou odesílány jako HTTP hlavička při každém požadavku na server (i když jste se podívali na obrázky). Existují pouze soubory cookie, existují pouze soubory cookie http. Soubory cookie lze oddělit hostitelem a cestou. To vše nám dává flexibilitu a pomáhá s bezpečností. V PHP nám obsah $_COOKIE poskytuje SAPI. Když PHP obdrží požadavek na zpracování, použité SAPI (php-fpm, cgi, mod_php mají své vlastní implementace SAPI) aktuálně vezme hlavičky a tělo požadavku, analyzuje je a vyplní všechna tato superglobální pole jako $_SERVER, $_GET, včetně $_COOKIES. Vše, co nám klient poslal (něco, co dělá požadavky, je klient, něco, co je zpracovává, je server) a prohlížeč nám posílá cookies jen ty, které jsou možné podle toho, kam je požadavek odeslán. Cookies se nastavují s hlavičkou Set-Cookie v odpovědi, to znamená, že si musíte přečíst více o HTTP v principu a ne o PHP. PHP vám prostě umožňuje pracovat s tou dobrotou. Soubory cookie můžete nastavit přímo prací s hlavičkami odpovědí pomocí funkce hlavičky. Kromě toho, pokud nastavíte životnost souborů cookie na 0, budou při zavření prohlížeče resetovány stejně, nikoli relace, protože všechny takové soubory cookie zapomene.

    Zde... sessions... V PHP je session obvykle soubor. Jen nějaký soubor s náhodným názvem. Pokud je například v php.ini specifikováno session.autostart nebo je zavoláno session_start, pak se pro uživatelskou relaci vytvoří soubor (můžete jej přesunout do ředkvičky nebo memcash, vašeho úložiště atd., v závislosti na vašich potřebách. také šifrovat data, což se děje ve výchozím nastavení). Tento soubor má ID, jen nějaký náhodný řetězec. A pokud během zpracování požadavku nedošlo k žádné relaci z předchozího požadavku, vytvoří se nová.

    A nyní se dostáváme k tomu nejzajímavějšímu – jak PHP propojí relaci z předchozího požadavku na aktuální. A tady je všechno docela jednoduché - sušenky. Když je uživateli přiřazena relace, automaticky se nastaví cookie pouze http (aby zlí lidé nemohli ukrást naši relaci z js), do kterého je zapsán identifikátor relace. V debuggeru prohlížeče můžete při experimentování s relacemi zjistit, zda máte soubor cookie PHPSESSID (název lze změnit v nastavení a obecně lze relace nejen propojovat prostřednictvím souborů cookie, ale jedná se o bezpečnostní pera).

    Když je požadavek zpracován SAPI, v přítomnosti session.autostart, před zahájením vytváření nové relace se puff stále podívá, zda máme cookie s ID relace, zkontroluje, zda nějaké má, a pokud ano, uklidňuje se a nevytváří nový. Vzhledem k tomu, že relace je vázána prostřednictvím souborů cookie, můžete nastavit životnost tohoto cookie samotného (v php.ini) a upravit tak dobu trvání relace.

    Zde... kdy používat soubory cookie a kdy relace? Je žádoucí pochopit, že čím více dat v cookies (a mají omezený počet slov), tím více dat přeneseme pro každý požadavek. To znamená, že není v pohodě, když abychom získali 1 kilobajt dat, musíme přenést pár kilobajtů cookies v hlavičkách. Lidé orientovaní na optimalizaci dokonce ukládají obrázky na samostatné domény bez souborů cookie, aby snížili objem provozu a paketů (obvykle jednoduchý požadavek HTTP se vejde do velikosti jednoho paketu TCP). Pokud potřebujete pracovat s těmito daty z JS na jakékoli stránce, například v národním prostředí vybraném uživatelem, aby bylo možné použít překlady také v JS, měli byste použít soubory cookie. Na všechno ostatní je samozřejmě lepší používat relace. V každém případě v počátečních fázích, kdy nemusíte dělat nic moc složitého.

    Cookies jsou mechanismem pro prohlížeč vzdáleného počítače k ​​ukládání dat k identifikaci vracejících se návštěvníků a k ukládání parametrů webové stránky (jako jsou proměnné).

    Uvedeme příklad použití Cookies na konkrétním příkladu.

    Předpokládejme, že potřebujeme napsat počítadlo návštěv stránek. Potřebujeme vědět, kolik návštěv stránky provedl každý jednotlivý návštěvník.

    Tento problém lze vyřešit dvěma způsoby. Prvním z nich je vedení záznamů o IP adresách uživatelů. To vyžaduje databázi pouze jedné tabulky, jejíž přibližná struktura je následující:

    Když uživatel navštíví stránku, potřebujeme zjistit jeho IP adresu, vyhledat informace o jeho návštěvách v databázi, zvýšit počítadlo a zobrazit jej v prohlížeči návštěvníka. Napsat handler (skript) pro takový postup není těžké. Při použití této metody však máme následující problémy:

    • Pro každou IP adresu je potřeba vést záznamy v jedné tabulce, která může být velmi velká. A z toho vyplývá, že iracionálně využíváme čas procesoru a místo na disku;
    • Většina domácích uživatelů má dynamické IP adresy. To znamená, že dnes je jeho adresa 212.218.78.124 a zítra - 212.218.78.137. Pravděpodobnost identifikace jednoho uživatele několikrát je tedy vysoká.

    Můžete použít druhý způsob, který je mnohem jednodušší na implementaci a efektivnější. Cookie nastavíme na proměnnou, která bude uložena na disku vzdáleného uživatele. Tato proměnná bude ukládat informace o návštěvách. Skript jej přečte, když návštěvník přistoupí na server. Přínos této metody identifikace je zřejmý. Za prvé, nepotřebujeme ukládat spoustu zbytečných informací o IP adresách. Zadruhé nás nezajímají dynamické IP adresy, protože údaje o jejich návštěvách se ukládají speciálně pro každého návštěvníka webu.

    Nyní je jasné, proč můžeme cookies používat – k ukládání malého množství informací od klienta (návštěvníka) webu, např.: nastavení webu (barva pozadí stránky, jazyk, design tabulky atd.), ale i další informace .

    Cookies jsou jednoduché textové soubory, které se ukládají na disk návštěvníků stránek. Cookies obsahují informace, které do nich server uložil.

    Programování souborů cookie

    Začněme programovat soubory cookie.

    Chcete-li nastavit soubory cookie, použijte funkci SetCookie(). Pro tuto funkci můžete zadat šest parametrů, z nichž jeden je povinný:

    • jméno - nastavuje název (řetězce) přiřazené souboru cookie;
    • hodnota - definuje hodnotu proměnné (řetězce);
    • expire - proměnná životnost (celé číslo). Pokud tento parametr není zadán, budou soubory cookie „žít“ až do konce relace, tedy do zavření prohlížeče. Pokud je zadán čas, pak když dorazí, cookie se sama zničí.
    • cesta - cesta k cookie (řetězec);
    • doména - doména (řetězec). Hodnota je nastavena na název hostitele, ze kterého byl soubor cookie nastaven;
    • secure - Přenos souborů cookie přes zabezpečené připojení HTTPS.

    Obvykle se používají pouze první tři parametry.

    Příklad nastavení cookies:



    SetCookie("Test" , "Hodnota" );

    // Nastavení cookie na jednu hodinu po nastavení:
    SetCookie("My_Cookie" , "Value" , ​​​​time()+ 3600);

    ?>

    Při používání cookies mějte na paměti, že cookies musí být nastaveny před prvním výstupem informace do prohlížeče (například echo příkazem nebo výstupem nějaké funkce). Proto je žádoucí nastavit Cookies hned na začátku skriptu. Cookies jsou nastaveny pomocí specifické hlavičky serveru, a pokud skript něco vypíše, znamená to, že se spouští tělo dokumentu. V důsledku toho nebudou soubory cookie nastaveny a může se zobrazit varování. Chcete-li zkontrolovat, zda byly soubory cookie úspěšně nastaveny, můžete použít následující metodu:

    // Nastavení cookie do konce relace:
    // Pokud je soubor cookie úspěšně nastaven, funkce SetCookie vrátí hodnotu TRUE:
    "

    Soubory cookie byly úspěšně nastaveny!

    " ;
    ?>

    Funkce SetCookie() vrátí TRUE, pokud byl soubor cookie úspěšně nastaven. V případě, že soubor cookie nelze nastavit, vrátí SetCookie() hodnotu FALSE a případně varování (v závislosti na nastavení PHP). Příklad neúspěšného nastavení souborů cookie:

    // Soubory cookie nelze nastavit, protože před odesláním
    // Záhlaví cookie, prohlížeči zobrazíme řetězec "Ahoj":
    echo "Ahoj" ;
    // Funkce SetCookie vrátí FALSE:
    if (SetCookie("Test" , "Value" )) echo "

    Soubor cookie byl úspěšně nastaven!

    " ;
    echo "

    Soubor cookie nelze nastavit!

    "
    ;
    // Vypíše "Cookie nelze nastavit!".
    ?>

    Soubor cookie nebylo možné nastavit, protože jsme před odesláním záhlaví cookie vytiskli do prohlížeče řetězec „Ahoj“.

    Čtení hodnot souborů cookie

    Získání přístupu ke cookies a jejich hodnotám je poměrně jednoduché. Jsou uloženy v superglobálech a $_COOKIE a $HTTP_COOKIE_VARS .

    Hodnoty jsou přístupné podle názvu sady souborů cookie, například:

    echo $_COOKIE["my_cookie"];
    // Vytiskne hodnoty sady cookie "My_Cookie"

    Příklad nastavení souboru cookie a následného přečtení:

    // Nastavit cookie "test" s hodnotou "Ahoj" na jednu hodinu:
    setcookie("test" , "Ahoj" , time()+ 3600 );
    // Další požadavek skriptu vypíše "Ahoj":
    echo @$_COOKIE["test"];
    ?>

    Ve výše uvedeném příkladu je při prvním přístupu ke skriptu soubor cookie „test“ nastaven na hodnotu „hello“. Při opětovném volání skriptu se zobrazí hodnota Cookie "test", tedy řetězec "Ahoj".

    Při čtení hodnot Cookies věnujte pozornost kontrole existence Cookies, například pomocí výpisu isset(). Buď potlačením chybového výstupu operátorem @

    A zde je příklad, jak vytvořit počítadlo načtení stránky pomocí souborů cookie:

    // Zkontrolujte, zda již byl nastaven soubor cookie "Mortal",
    // Pokud ano, přečtěte si jeho hodnotu,
    // A zvyšte hodnotu čítače přístupů na stránku:
    if (isset ($_COOKIE [ "Mortal" ])) $ cnt = $ _COOKIE [ "Mortal" ]+ 1 ;
    jinak $cnt = 0 ;
    // Nastavit soubor cookie "Mortal" s hodnotou počítadla,
    // S životností do 18.07.29,
    // To znamená, že na velmi dlouhou dobu:
    setcookie("Mortal" ,$cnt , 0x6FFFFFFF );
    // Zobrazuje počet návštěv (stažení) této stránky:
    echo "

    Navštívili jste tuto stránku " .@$_COOKIE["Smrtel"]. " jednou

    " ;
    ?>

    Mazání cookies

    Někdy je nutné soubory cookie smazat. To je snadné, stačí znovu nastavit cookie se stejným názvem a prázdným parametrem. Například:

    // Smazat cookie "Test":
    SetCookie("Test" , "" );
    ?>

    Nastavení řady souborů cookie a jehočtení

    Pole Cookies můžeme nastavit pomocí hranatých závorek v názvech Cookies a pak číst pole Cookies a hodnoty tohoto pole:

    // Nastavte pole Cookies:
    setcookie("cookie" , "První" );
    setcookie("cookie" , "Druhý" );
    setcookie("cookie" , "Třetí" );

    // Po opětovném načtení stránky zobrazíme
    // Složení pole cookies "cookie":
    if(isset($_COOKIE["cookie"]))(
    foreach($_COOKIE["cookie"] jako $name => $value) (
    echo "$name: $value
    " ;
    }
    }
    ?>

    Výhody používání cookies jsou nepopiratelné. S jejich používáním však existují určité problémy. První z nich je, že návštěvník může zablokovat přijímání cookies prohlížečem nebo jednoduše smazat všechny nebo část cookies. Můžeme tedy mít určité problémy s identifikací takových návštěvníků.



    <<< Назад Obsah Vpřed >>>
    Pokud máte další otázky nebo vám něco není jasné - vítejte u nás

    Životnost PHP proměnných $_SESSION a v důsledku toho i aktivita webových aplikací závisí na délce trvání relace. Pokud je například uživatel v systému autorizován, závisí na tomto parametru doba, po kterou může být nečinný, aniž by musel znovu zadávat přihlašovací jméno a heslo.

    Existují různé způsoby, jak nastavit dobu trvání relace. Zkusme na to přijít na příkladu operačního systému Linux.

    Jak zjistit dobu trvání relace

    Před nastavením se vyplatí podívat se na aktuální stav. Existuje několik způsobů, jak to provést:

    1. Na serveru pomocí příkazu php

    php -i | relace grep

    Získáme seznam parametrů souvisejících s relacemi. Máme zájem o:

    • session.cookie_lifetime => 0 => 0
    • session.gc_maxlifetime => 1440 => 1440

    Tato hodnota je výchozí hodnotou. cookie_lifetime => 0 označuje účinek cookies do zavření prohlížeče , pokud tento parametr nastavíte na určitou hodnotu, relace se přeruší, když je relace aktivní, proto je lepší ji nechat na nule.

    2. Pomocí php-funkce ini_get

    $maxlifetime = ini_get("session.gc_maxlifetime");
    $cookielifetime = ini_get("session.cookie_lifetime");

    echo $maxlifetime;
    echo $cookielifetime;

    systemctl restartovat apache2 || systemctl restart httpd

    * ve verzích Linuxu bez systemd použijte příkaz restart služby apache2 nebo restart služby httpd.

    Pokud používáme FastCGI (PHP-FPM):

    Konfigurace pomocí souboru .htaccess

    Tento soubor umožňuje webmasterovi spravovat některá nastavení webového serveru. Chcete-li jej upravit, potřebujete přístup k souborům webu. Metoda nebude fungovat, pokud se jako PHP handler nepoužije Apache, ale například NGINX + PHP-FPM. I když existuje také způsob (bude diskutován níže).

    Do souboru .htaccess přidáme následující:

    php_value session.gc_maxlifetime 86400
    php_value session.cookie_lifetime 0

    * Jak vidíte, parametry jsou stejné jako při konfiguraci přes php.ini.

    Jak bylo uvedeno výše, metoda nebude fungovat, pokud se nepoužívá Apache. Konfigurace však může být provedena na serveru (opět musíme mít příslušný přístup).

    Otevřete konfigurační soubor webového serveru, například v php-fpm:

    vi /etc/php-fpm.d/www.conf

    a upravit/přidat:

    php_value = 86400
    php_value=0

    Po restartu služby:

    systemctl restart php-fpm || restart služby php-fpm

    Nastavení parametru v kódu aplikace

    Tato metoda může být užitečná, když různé portálové stránky potřebují mít různé doby trvání relace. K tomu můžete použít funkce PHP ini_set a session_set_cookie_params, například:

    Ini_set("session.gc_maxlifetime", 86400);
    ini_set("session.cookie_lifetime", 0);
    session_set_cookie_params(0);

    session_start();

    Funkce musí být volány před otevřením relace (session_start).

    Nastavení relace v aplikaci

    Některé aplikace mohou přepsat nastavení. V tomto případě je nutné v parametrech programu nastavit životnost relace. Každá aplikace má své vlastní nastavení, na které musíte přijít sami. Uveďme příklad nastavení relace v CMS Bitrix.

    Jdeme do Skupina uživatelů- vybrat skupinu - Bezpečnost. Najdeme parametr „Session lifetime (minutes)“ a nastavíme čas, například 1440 (24 hodin v minutách).

    Jak automaticky obnovovat relace

    Pokud je relace vydána na určité období a skončí v určitou dobu, může to vést k přerušení aktivní relace uživatele. Mnohem pohodlnější je, pokud se doba trvání relace automaticky prodlouží, pokud návštěvník stránku obnoví. K tomu slouží parametr cookie_lifetime, který ve všech výše uvedených příkladech nastavíme na 0.

    Pokud nastavíme hodnotu cookie_lifetime na 86400, bude relace ukončena po 24 hodinách. To není vždy výhodné.

    Pokud je potřeba relaci ovládat a přerušit, můžete použít funkci php session_destroy().

    Cesta úložiště souboru relace

    Umístění pro ukládání souborů relace je nastaveno parametrem session.save_path také, stejně jako doba života. Ve výchozím nastavení lze použít cestu /var/lib/php/sessions.

    Toto je důležitý parametr – pokud webový server nemá přístup k zápisu do tohoto adresáře, povede to k nemožnosti ukládat relace, což způsobí neočekávané výsledky v aplikacích.