Nette 2.0 Cache, ukládá se do rootu a ne do temp

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

Jediný robotloader se mi ukládá do temp diru, jinak se to vše ukládá do rootu serveru, problém bude asi v tom, že context se vytváří znovu a není založený na configuratoru v případě použití cache?

David Grudl
Nette Core | 8142
+
0
-

Asi by to chtělo nějakou ukázku bootstrapu, proč se vytváří znovu.

mcmatak
Člen | 490
+
0
-
<?php

/**
 * My Application bootstrap file.
 */


use Nette\Diagnostics\Debugger,
	Nette\Application\Routers\SimpleRouter,
	Nette\Application\Routers\Route;


// Load Nette Framework
// this allows load Nette Framework classes automatically so that
// you don't have to litter your code with 'require' statements
require LIBS_DIR . '/Nette/loader.php';


// Enable Nette\Debug for error visualisation & logging
Debugger::$strictMode = TRUE;
Debugger::enable(Debugger::DETECT, APP_DIR . '/../data/log', 'tech@info.cz');
Debugger::$maxLen = 2000;

// Load configuration from config.neon file
$configurator = new Nette\Configurator;
$configurator->loadConfig(__DIR__ . '/config.neon');


// Configure application
$application = $configurator->container->application;
$application->errorPresenter = 'Error';
//TODO: vubec nevim jestli na isproduction by se melo ptat takhle
if (!$configurator->container->params['productionMode']) {
	$application->catchExceptions = false;
}
else {
	$application->catchExceptions = true;
}



// Setup router
$application->onStartup[] = function() use ($application) {
	$router = $application->getRouter();

	$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);

	$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
};


// Run the application!
$application->run();

?>

když se dívám do kódu tak problém vidím spíš v nette (ale, kde že? no řádky teď z hlavy nevysypu, stává se to jen mně?)

mi se zdá, že context se vytváří v configuratoru v bootstrapu a tam se také načte tempdir, ale když volám getCache tak se context vytvoří znovu, ale nezná tempdir!

<?php

common:
	variables:
		dataDir: %appDir%/../data
		tempDir: %dataDir%/temp
		logDir: %dataDir%/log

	php:
		date.timezone: Europe/Prague
		iconv.internal_encoding: UTF-8
		mbstring.internal_encoding: UTF-8
		default_charset: UTF-8
		session.save_path: "%appDir%/../data/sessions"

	services:

		robotLoader:
			option:
				directory: [%appDir%, %libsDir%]
			run: true

production < common:

development < common:

console < common:

?>

Nette Framework (version 2.0-dev released on 2011–06–03, https://nette.org)

studna
Člen | 181
+
0
-

Nevoláš pak náhodou Environment::getCache()?

mcmatak
Člen | 490
+
0
-

myslim že volám getCache na contextu

Filip Procházka
Moderator | 4668
+
0
-

V momentě kdy zavoláš Debugger::enable(Debugger::DETECT) tak se ti vytvoří instance Configuratoru. Což bylo konečně pořešeno. Každopádně, pokud máš averzi vůči nightly, můžeš to dočasně pořešit takto:

Debugger::enable(Nette\Configurator::detectProductionMode());
mcmatak
Člen | 490
+
0
-

nezabralo to :(

do rootu diksu se uklada

_Nette.Configurator
_Nette.FileTemplate

do tempu se uklada

cache\robotoloader a vsechny dalsi cache

Editoval mcmatak (29. 6. 2011 23:40)

David Grudl
Nette Core | 8142
+
0
-

mcmatak napsal(a):

//TODO: vubec nevim jestli na isproduction by se melo ptat takhle
if (!$configurator->container->params[‚productionMode‘]) {
$application->catchExceptions = false;
}
else {
$application->catchExceptions = true;
}

Pole params je určeno pro továrničky uvnitř containeru, aplikace z toho obecně číst neměla, každopádně zrovna nastavení catchExceptions je podle productionMode nastavuje automaticky.

mcmatak
Člen | 490
+
0
-

hm ok díky, takže prostě ho vůbec nenastavovat a ono se nastaví samo, tedy stačí řádek

<?php
$application = $configurator->container->application;
$application->errorPresenter = 'Error';
?>

a nic víc?

ok to sem nevěděl, od které verze se to tak chová? mám už nette vsude a stále většina věcí jede na 0.9.5

každopádně

  1. jak testovat production? když opravdu někde v app to chci udělat
  2. co ta cache? :) pořád mi to nefachá, já sem několikrát projížděl zdrojáky a zdá se mi že se opravdu context vytváří dvakrát?
David Grudl
Nette Core | 8142
+
0
-

ad production mode: po „staru“ je a bude stále k dispozici metoda Environment::isProduction(), po „dependencyinjekšnu“ je v systémovém kontejneru proměnná params['productionMode'], kterou mají k dispozici jednotlivé továrničky a propagují ji dál. Například továrnička na Application podle toho nastaví $catchExceptions, tvá továrnička podle toho může nastavit komponenty atd.

ad cache: je možné, že se context vytváří dvakrát, a je to samozřejmě bug. Zkus tam dát breakpoint, zjistit proč se to děje. Já netuším…

mcmatak
Člen | 490
+
0
-

abych teda zjistil který proces zapisuje do toho root/cache tak jsem ten adresář upravil, aby do něho nešlo zapisovat a debugger mi řekl, že se o to pokouší tento řádek

$configurator->loadConfig(__DIR__ . ‚/config.neon‘);

už v bootstrapu

bavíme se o nightbuild

moc nerozumím tomu, že ten problém mám jen já, mám snad ten config.neon nastaven špatně?

mcmatak
Člen | 490
+
0
-

takže řešením je nastavit temp_dir

v index.php
define(‚TEMP_DIR‘, WWW_DIR . ‚/../data/temp‘);

zdá se, že tedy v config.neon nelze nastavit tempdir, že?

resp. za to může Nette\Configurator

řádek 49

<?php
defined('WWW_DIR') && $this->container->params['wwwDir'] = realpath(WWW_DIR);
defined('APP_DIR') && $this->container->params['appDir'] = realpath(APP_DIR);
defined('LIBS_DIR') && $this->container->params['libsDir'] = realpath(LIBS_DIR);
defined('TEMP_DIR') && $this->container->params['tempDir'] = realpath(TEMP_DIR);
?>
David Grudl
Nette Core | 8142
+
0
-

mcmatak napsal(a):

zdá se, že tedy v config.neon nelze nastavit tempdir, že?

Ano, stejně tak třeba logDir, který se používá ještě před $configurator->loadConfig().

mcmatak
Člen | 490
+
0
-

ok díky, zdá se že to fachá