Autor Zpráva
Chodec
Profil
Ahoj.
Řeším jeden problém s ukládáním cookies. Pokud se v průběhu vykonávání PHP scriptu, opustí stránka (odkaz, formulář, F5, zavření prohlížeče), tak se PHP script sice vykoná celý včetně odeslání hlaviček, ale cookies se v prohlížeči neuloží.

Například, když se spustím script:
SetCookie ("test", MicroTime (true), ["expires" => Time () + 60]);
uSleep (1000 * 1000 * 10);
A po 5 vteřinách se opustí stránka, funkce SetCookie () se vykoná úspěšně (vrátí true), ale žádné cookies se neuloží.

Potřebuji do cookies ukládat kontrolní kód, který se mění. Bohužel mě nenapadá jakákoli možnost, jak jeho uložení ověřit. Pak samozřejmě může dojít k jeho neshodě.
Kajman
Profil
A v prohlížeči vidíte, že server poslal v hlavičce tu cookie? Jestli on to nemá jen u sebe v bufferu.
Chodec
Profil
Jak to zjistím? Vím, že funkce SetCookie () vrátí true, ale to je asi tak všechno.
Keeehi
Profil
Chodec:
tak se PHP script sice vykoná celý včetně odeslání hlaviček, ale cookies se v prohlížeči neuloží.
Samozřejmě. Pokud návštěvník odejde na novou stránku tak mu žádné hlavičky nedojdou i když si je odesíláš.

To že máš funkci setCookie někde nahoře ve scriptu a pak ti po ní něco dlouho běží tak to ještě neznamená, že se ty hlavičky odešlou a až pak se začne něco počítat. Představ si, že by tam byl třeba v cyklu nějaký výpis z databáze. Kdyby ten server odeslal klientovi cookies, pak hned první řádek, hned zase druhý řádek a v zápětí třetí atd. To by bylo celkem neefektivní. Takže to co se ve tvém případě děje je to, že php neposílá výstupy uživateli hned, ale ukládá si to do nejaké paměti, když by měl vypsat něco dalšího, tak to do té paměti jen přidá. A celý balík se uživateli odešle až když script skončí. Takže pokud uživatel v mezičase odejde, než se to stihne dokončit už mu není ten obsah kam doručit.

PHP se dá samozřejmě říct, aby si ten obsah nehromadilo v paměti ale rovnou ho posílalo. Nebo jiným příkazem aby to co v paměti má ihned odeslalo a pak si může v hromadění zase pokračoval.
Pro toto odeslání slouží funkce flush();. Dej jí za setCookie a je možné, že se je povede odeslat hned.
Je taky možné, že to ukládání do paměti než doběhne celý script může způsobovat i něco jiného. Může to dělat nějaký framework pokud používáš nebo taky samotný webserver. Pokud to dělají oni, funkce flush tu nepomůže a budeš muset hledat, jak se to vypíná pro tu danou část, která to dělá. Také to může být kombinace a může se to dít na více místech.

A ještě rada na závěr. Není dobré mít dlouho běžící php scripty které byly spuštěné na základě uživatelské akce. Je vhodné to rozdělit. Uživateli sdělit, že se na tom pracuje a na pozadí to spravovávat nějakým jiným scriptem. Pak bys na tento problém vůbec nenarazil. Říct uživateli - díky za data, pracujeme na tom, až to bude tak výsledek najdete tam a tam - to není nijak časově náročné takže nemusíš řešit jak dlouho by tento kraťoučký script běžel a tudíž by uživatel prakticky vždy dostal tu cookie.
Chodec
Profil
Zkusil jsem dát do výše uvedeného příkladu funkci Flush () hned za funkci SetCookie (). Pokud opustím stránku před koncem PHP scriptu, cookies se stále neuloží. Podotýkám, že to zkouším na samostatném scriptu.

Zkuste tento kód spustit ve vašem prostředí a třeba jen 3x zmáčknout F5:
Session_Start ();
$date_time = Date ("Y-m-d H:i:s");
 
if (!IsSet ($_COOKIE["test"])) $_COOKIE["test"] = $date_time;
if (!IsSet ($_SESSION["test"])) $_SESSION["test"] = $date_time;
 
echo $_COOKIE["test"]."<hr>";
SetCookie ("test", $date_time, ["expires" => 0]);
 
Flush ();
 
echo $_SESSION["test"];
$_SESSION["test"] = $date_time;
 
uSleep (1000 * 1000 * 5);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0