Deaktivace automatického startování Nette\Session
- VeN
- Člen | 46
Ahoj, rád bych se zeptal, zda je možné nějakým způsobem vypnout automatické startování session, které provádí Nette\Application::run().
<?php
// autostarts session
$session = $this->getSession();
if (!$session->isStarted() && $session->exists()) {
$session->start();
}
?>
Nedělal jste to někdo?
- arron
- Člen | 464
VeN napsal(a):
Hle, to me nenapadlo podstrcit Nette fake Session. Je to trochu pres ruku, protoze session se vytvari tak jak se vytvari, ale samozrejme to jde:
//bootstrap.php pred nahranim configu
$configurator = Environment::getConfigurator();
$configurator->defaultServices['Nette\\Web\\Session'] = 'FakeSession';
//FakeSession je zdedena trida od Session a ma prepsane metody tak, aby nic nedelaly:-)
Zaroven souhlasim, ze to asi bude potreba velmi zridka.
Jenom podotykam, ze ten kod se tyka verze Nette 1.0dev pred zavedenim contextu. Nicmene by to melo fungovat i v predchozich verzich.
Editoval arron (21. 10. 2010 17:40)
- Patrik Votoček
- Člen | 2221
Jasně že jde… Session je přece služba… https://api.nette.org/…tor.php.html#38
EDIT: koukám zase pozdě…
- VeN
- Člen | 46
Kód je funkční pro Nette v revizi cc4b6c9a11d253cd3203f757b759e65727248762. Aktuální devel verzi nemám, protože je tam (nebo alespoň před pár dny byl) rozkopaný Context.
<?php
namespace Medio\Session;
/**
* Fake Session doing nothing
*
* If you want to use it, you have to configure it in bootstrap like that:
*
* $sLocator = $this->getApplication()->getServiceLocator()->getParent();
* $sLocator->removeService('Nette\Web\Session');
* $sLocator->addService('Nette\Web\Session', '\Medio\Session\FakeSession');
*
* Code above must be called before any other bootstrap configuration.
*/
class FakeSession extends \Nette\Web\Session
{
/**
* Starts and initializes session data.
* @return void
*/
public function start()
{
}
/**
* Ends the current session and store session data.
* @return void
*/
public function close()
{
}
/**
* Destroys all data registered to a session.
* @return void
*/
public function destroy()
{
}
/**
* Does session exists for the current request?
* @return bool
*/
public function exists()
{
return self::isStarted();
}
/**
* Has been session started?
* @return bool
*/
public function isStarted()
{
return TRUE;
}
// Maybe it should override more methods,
// but now I don't need anything else :)
}
?>
Editoval VeN (22. 10. 2010 14:52)
- VeN
- Člen | 46
Jinak ještě napíšu, proč vlastně chci startování session vypnout. Mám aplikaci, která jí k ničemu nepoužívá a která bude (doufám :)) relativně hodně navštěvovaná. Session se ve výchozím nastavení serveru ukládá do souborů v adresáři /tmp a tyto soubory se AFAIK nijak nemažou. Může se tedy stát, že po několika dnech provozu nám počet souborů v /tmp naroste nad nadkritickou hladinu (např. půl milionu), což může způsobit problémy s výkonem serveru.