Autor Zpráva
igamenir
Profil
Zdravím,
řešil jsem jeden problém s objekty v session. Idea byla, že se při příchodu na stránku vytvoří řídící objekt, bude se stále předávat a při odhlášení nebo konci session se objekt zruší. Aby tato idea fungovala, potřeboval jsem při konci objektu provést nějaké události a počítal jsem, že se o to postará __destruct. Bohužel jsem ale zjistil, že destruct i construct je prováděn při každém zpracování skriptu. To bych přežil, ale z nějakého důvodu se automatické serialize provádí až po destruct! Přijde mi to padlé na hlavu ale co nadělám.
Nevíte ale, jak tedy zajistit kód, který se vyvolá při zničení objektu po vypršení session?

ukázkový kód značně zjednodušený: (místo obyčejného přiřazování a vypisování si představte složité práce s databází, třeba vyprázdnění košíku, odhlášení uživatel, smazání nepoužitých zdrojů, atp.)
class Test {
  public $id;
  public function __construct() { $this->id = 0;}
  public function __destruct() { $this->id = 0;}
}

session_start();
if (empty($_SESSION['test'])) {
  $_SESSION['test'] = new Test();
  $_SESSION['test']->id = 2;
} else {
  echo 'id: '.$_SESSION['test']->id; // tady potřebuju 2, ale vypíše se nula, protože byl proveden destruct
  unset($_SESSION['test']); // až tady chci kód z destruct
}
Lamicz
Profil
Problém je, že v tomto případě nelze použít ani __sleep a __wakeup, protože se pokaždé spouští také (interně se dělá automaticky serialize a unserialize). Objekt v SESSION jsem taky používal, ale došel jsem k závěru, že to není moc výhodný, práce s tím je pomalá z důvodu poměrně složitého serializovaného stringu a hlavně opakované volání serialize a unserialize je dost pomalé. Jako další nevýhoda je fakt, že vzorová třída musí být stále k dispozici (alespoň mi to jinak nefungovalo). Klasické pole mi přijde lepší. U PHP bohužel platí fakt, že čím je SESSION file na serveru složitější a větší, tím se začne stránka drasticky zpomalovat - je potřeba tam mít co nejméně dat s co nejjednodušší strukturou.

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: