IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: PHP session

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Tomáš Dvořák:6.1.2019 10:51

Ahoj, řeším problém se session. Pomocí session držím uživatele přihlášeného a používám k němu košík. Problém je, že se mi session ukončí dříve, než má trvanlivost. Kontaktoval jsem i poskytovatele a ten tvrdí, že má vše v pořádku. Session jako taková se mi v prohlížeči jeví, že má platnost na dalších 10 dní - tedy je to v pořádku.

Problém je, že po určité nahodilé době se mi session ukončí a tím se odhlásí uživatel, který po novém přihlášení samozřejmě ztratí vše co měl uložené v košíku, protože dostane nové ID.

Zkusil jsem: Mám nastaveno toto:

session_set_cookie_params(864000);
session_start([
    'cookie_lifetime' => 864000,
     'gc_maxlifetime' => 864000,
 ]);

Chci docílit: Snažím se dosáhnout toho, aby si session pamatovala uživatele na zvolenou dobu. Resp. jakým způsobem mám nastavit session (či jiný prostředek) k tomu, aby si uživatele prohlížeč a server pamatoval?

Děkuji

 
Odpovědět
6.1.2019 10:51
Avatar
Tomáš Dvořák:6.1.2019 11:04

P.S.: I když jsem změnil hodnotu na 0, tak se mi to asi po 5 minutách změnilo (PHPSESSID) a tím došlo k odhlášení.

 
Nahoru Odpovědět
6.1.2019 11:04
Avatar
Odpovídá na Tomáš Dvořák
Michal Šmahel:6.1.2019 13:07

Ahoj, na trvalejší uchování dat, které netvoří bezpečnostní riziko při odcizení (ID, náhodné řetězce a další identifikační prostředky), je lepší využít COOKIES. U nich si můžeš nastavit dobu platnosti celkem jednoduše a pokud si uživatel COOKIES nepromaže, tuto dobu tebou vytvořená COOKIE vydrží.

Vždy si však dávej pozor na to, co do COOKIES ukládáš. Počítej s tím, že se ukládají do počítače uživatele a je k nim poměrně dobrý přístup pro malware nebo další osoby mající přístup na jeho profil.

Nahoru Odpovědět
6.1.2019 13:07
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.1.2019 7:42

Existuje funkce session_regene­rate_id, pouziti viz manual php.net.
Session se obvykle samo o sobe neztrati. Muze to byt nejaky problem s prohlizecem nebo na serveru.
V nejhorsim bych data zkusil ukladat do databaze. V mene horsim cookies, jak pise Michal Šmahel.

 
Nahoru Odpovědět
7.1.2019 7:42
Avatar
Odpovídá na Peter Mlich
Tomáš Dvořák:7.1.2019 8:40

Čekám na odpověď z hostingu, ale spíše to vypadá, že jim GC jede podle cronu, resp. že GC promazává session, které nemá. Protože, když jsem hodil session do jiné složky, do které nemá přístup GC, tak je to v pořádku. Že se změní session_id mi je vcelku jedno, protože si samozřejmě ukládám data do session, ne session_id.

Session regenerate mi v tomto případně asi nepomůže, protože, když hodnoty v session nevydrží ani 3 hodiny, tak je problém někde jinde.

Druhý problém, který jsem řešil byl v tom, že slavný Foxydesk chat má v sobě mazání session (session_destroy) a startování session se @. Když jsem chtěl hodit session do jiné složky, tak mi to tam přegenerovávalo session dvakrát a prohlížeč resp. server nevěděl co s tím.

Takže, když to shrnu, tak problém vidím v tuto chvíli u hostingu a ve Foxydesku. Dám vědět, zda to bylo opravdu GC.

 
Nahoru Odpovědět
7.1.2019 8:40
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:7.1.2019 9:21

Session ma tusim expire time kolem 17 nebo 30 min. Jestli si to treba nepletes cookies, kde se da nastavit i nekolik dni. V tom pripade bych sel do databaze a propojil to na id zakaznika.

Ano, muzou mit nastavene promazavani session cronem. Je to sice nezvykle, smazat uplne vse, nehlede na cas, ale dava to smysl.

 
Nahoru Odpovědět
7.1.2019 9:21
Avatar
Odpovídá na Peter Mlich
Tomáš Dvořák:8.1.2019 8:30

Mno, nastavil jsem session path na každou doménu a subdoménu zvlášť, tedy by již do toho neměl GC hrabat. Vyhodil jsem Foxydesk, který v tom dělal mrdník.
Situace je takové, že jeden web drží dobře, druhý prostě informovaci v session neudrží (session ID jako takové mi je vcelku jedno, jestli se mění co 5 minunt nebo co hodinu).
Už s tím začínám být zoufalý.

Předpokládám, že rozdíl mezi ukládání do vlastní složky nebo do DB není rozdíl, přemýšlím správně?

Obávám se, že to budu muset překopat a namísto session použít na tu jednu jedinou identifikaci cookies.

Kde ještě hledat?

 
Nahoru Odpovědět
8.1.2019 8:30
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:8.1.2019 9:11

Pouzit db.
Do cookies muzes ulozit hash, ktery ziska od prihlasovaciho systemu. Ten hash mu ulozis do db s casem posledniho kliknuti. Proste, cely ten system kolem prihlaseni predelat ze session na db.

session_regene­rate_id - mozna to pomuze, mozna ne. Jestli ti session mazou uplne, tak to asi nepomuze. Na jednom serveru jsem to musel pouzivat.

Mozna si session prepisujes. Muzes zkusit na prvni radek dat ob_start. Ale musi to byt uplne prvni radek stranky, pred prvnim echo. Podobne musi byt session_start.
Pokud tam vypises error nebo jen zalomeni radku, muze byt server nastaven tak, ze odesila aktualni ukoncenou cast php kodu uzivateli. Vytvori tedy header. Nemas tam session_start, tak ti session odhlasi.
Na serveru je mozne nastavit jine chovani. Proto ti to mozna jinde funguje.
Je to pak problem spatne napsaneho kodu.

- - -
Hele, takhle, tezko rici, v cem je problem. Problem mas u sebe. Vyrob jednoduchy priklad, 1-2-3 ministranky, ktere resi jen to prihlaseni. Aby jsme to mohly testovat. Mozna od zacatku mas chybny kod. Nevidime, kde mas chybu, nemuzeme poradit, co s tim. Tak, co ocekavas?

 
Nahoru Odpovědět
8.1.2019 9:11
Avatar
Odpovídá na Peter Mlich
Tomáš Dvořák:8.1.2019 11:14

Tady je kód, který mi neudrží hodnoty v session:

index.php

<?php
session_start();

echo "Start: ".date('Y-m-d H:i:s')."<br>";

echo 'Session:<br>';
echo $_SESSION['jmeno']; echo '<br>';
echo $_SESSION['redirect_logout']; echo '<br>';
echo $_SESSION['level']; echo '<br>';
echo session_id();

login.php

<?php
session_start();

$_SESSION['jmeno'] = 'Josef Novak';
$_SESSION['redirect_logout'] = 'URL';
$_SESSION['level'] = '42';

echo '<meta http-equiv="refresh" content="0;url=index.php">';

Já se nebráním tomu, že je chyba na mé straně, nicméně když nefunguje spolehlivě ani tento jednoduchý kód, tak to spíše vidím na chybu na straně serveru.

 
Nahoru Odpovědět
8.1.2019 11:14
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:8.1.2019 15:35

At uz tam dam header nebo location, tak mi to na localhost funguje.

-- index.php --
<?php
session_start();

echo "index";
include "print.php";
?>

-- login.php --
<?php
session_start();

$_SESSION['jmeno'] = 'Josef Novak';
$_SESSION['redirect_logout'] = 'URL';
$_SESSION['level'] = '42';

echo "login";
//include "print.php";
//echo '<meta http-equiv="refresh" content="0;url=index.php">';
header('Location: index.php')
?>

-- logout.php --
<?php
session_start();

session_unset();
//@unset($_SESSION);

echo "logout";
include "print.php";
?>

-- page.php --
<?php
session_start();

echo "page";
include "print.php";
?>

-- print.php --
<ul>
<li><a href="index.php">index</a></li>
<li><a href="page.php">page</a></li>
<li><a href="login.php">login</a></li>
<li><a href="logout.php">logout</a></li>
</ul>

<?php
echo "<pre>";
//echo "File: " . __FILE__ . "<br>";
echo "Time: " . date('Y-m-d H:i:s') . "<br>";
echo "Session:";
var_dump($_SESSION) . "<br>";
echo "Session id:" . session_id();
?>

Ale jako podezrele je to presmerovani pres meta tag.
Jeste by to mohlo souviset propojovanim obsahu http a https do jedne stranky, ze to server blokuje treba.
Muzes zkusit tohle:

-- login.php ---
<?php
session_start();

$_SESSION['jmeno'] = 'Josef Novak';
$_SESSION['redirect_logout'] = 'URL';
$_SESSION['level'] = '42';

echo "login";
//include "print.php";
//echo '<meta http-equiv="refresh" content="0;url=index.php">';
header('Location: index.php?sid='.session_id());
?>

-- index.php --
<?php
session_start();
if (isset($_GET['sid']))
        {
        session_id($_GET['sid']);
        }

echo "index";
include "print.php";
?>

Nemyslim si, ze to bude nejaky rozdil. Na localhostu mam pokazde stejne sid.
4658ltuots107o­geaj8n7r86j3

 
Nahoru Odpovědět
8.1.2019 15:35
Avatar
Odpovídá na Peter Mlich
Tomáš Dvořák:8.1.2019 17:33

Ta session funguje, nastaví se hodnoty. Jen po nějaké době hodnoty vypadnout, ikdyž by vypadnout neměli. Nastavil jsem tam ještě session_save_path a drží to.

Tedy to spíše vypadá, že problém budu mít někde v kódu, ale nevím kde. Spíš bych se tedy přikláněl k tomu, že to odešle někde něco a pošle to novou session. nicméně všude kde to mám, tak session start se spouští na začátku scriptu a chyby neeviduji.

Může to mít spojitost s ob_start, které používáme pro zvýraznění textu?

 
Nahoru Odpovědět
8.1.2019 17:33
Avatar
Tomáš Dvořák:9.1.2019 7:09

Tak ještě jeden poznatek.

Večer jsem si uložil do session hodnoty. Napsal si název session. Dnes ráno jsem se ještě před aktualizací stránky podíval zda soubor existuje a bohužel již ne. Tedy ke smazání došlo během noci.

Jak je možné, že se session smazala ze složky, do které by např. GC neměl mít přístup. Složku jsem definoval pomocí session_save_path.

 
Nahoru Odpovědět
9.1.2019 7:09
Avatar
Tomáš Dvořák:9.1.2019 19:55

Tak to nakonec dopadlo tak, že hosting nastavil gc na delší dobu a vypadá, že to jede.

 
Nahoru Odpovědět
9.1.2019 19:55
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.