Deaktivace automatického startování Nette\Session

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
VeN
Člen | 46
+
0
-

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
+
0
-

Ono uz z toho kodu je trochu videt, ze to asi moc nepujde, nicmene koukal jsem primo do tridy Session a nikde jsem si tam nevsimnul niceho, co by me vedlo k tomu, ze by to slo vypnout.

VeN
Člen | 46
+
0
-

Ano je to vidět. Ani nejde aplikaci podstrčit nějakou fake Session instanci, neb tam není setter na session. Nechce se mi ale věřit, že si Nette vždy vynucuje aktivaci session.

jtousek
Člen | 951
+
0
-

Nějak si neumím představit aplikaci, kde bych session nepotřeboval…

arron
Člen | 464
+
0
-

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
+
0
-

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
+
0
-

Díky za rady. Nejsem zatím takový kamarád se service locatorem v Nette, takže jsem to hned napoprvé neviděl. Teď už by to mělo jít.

OK3
Člen | 91
+
0
-

A jak's to teda vypnul? :) Aby bylo vidět finální řešení.. Dík

VeN
Člen | 46
+
0
-

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
+
0
-

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.

OK3
Člen | 91
+
0
-

Co se stane, když se pouze odstraní původní služba?

$sLocator = $this->getApplication()->getServiceLocator()->getParent();
$sLocator->removeService('Nette\Web\Session');

Editoval OK3 (22. 10. 2010 14:44)

VeN
Člen | 46
+
0
-

Vyhodí se InvalidStateException s hláškou: Service ‚Nette\Web\Session‘ not found.