Directory ‚%tempDir%/cache‘ not found

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

Čus nettisti :),
10.5.2011 vyšli dva různé buildy nette. Od toho druhého buildu, se mi hnedka při startu aplikace, zobrazí tento error Directory '%tempDir%/cache' not found.

Editoval loov (13. 5. 2011 22:44)

Aurielle
Člen | 1281
+
0
-

Tak tu složku vytvoř a nastav jí práva pro zápis.

loov
Člen | 49
+
0
-

Tu složku já ale vytvořenou mám a zapisuje se do ní. Je to tak, že mám projekt, ve kterém se snažím udržovat vždy poslední dev verzi Nette. A v předchozích verzích se normálně pracuje s adresářem cache, ale v této verzi mě to zahlásí najednou chybu. Takže si právě myslím, že to nebude chyba v mé adresářové struktuře.

loov
Člen | 49
+
0
-

Totiž došlo k rozdílu fcí createTemplateCacheStorage() V té původní byl obsah takový

<?php

	/**
	 * @return ICacheStorage
	 */
	public static function createTemplateCacheStorage()
	{
		$dir = NEnvironment::getVariable('tempDir') . '/cache';
		umask(0000);
		@mkdir($dir, 0777); // @ - directory may exists
		return new NTemplateCacheStorage($dir);
	}

?>

a nyní je takový

<?php

	/**
	 * @return ICacheStorage
	 */
	public static function createCacheStorage(IDiContainer $container)
	{
		$dir = $container->expand('%tempDir%/cache');
		umask(0000);
		@mkdir($dir, 0777); // @ - directory may exists
		return new NFileStorage($dir, $container->getService('Nette\\Caching\\ICacheJournal'));
	}

?>

Jinak můj projekt beží na Win 7 x64 s xamppem ve verzi 2.5 (PHP 5.2.9)

Editoval loov (14. 5. 2011 10:31)

Ondřej Mirtes
Člen | 1536
+
0
-

Já ten problém vidím. Je v tom, že se ti neexpanduje ta proměnná %tempDir%. Musí být nastavená jako parametr DI kontejneru, což by Nette mělo dělat samo: https://api.nette.org/…tor.php.html#275

Máš nadefinovanou konstantu TEMP_DIR?

loov
Člen | 49
+
0
-

TEMP_DIR mám definovaný v indexu.php

<?php
// absolute filesystem path to the temporary files
define('TEMP_DIR', WWW_DIR . '/../temp');
?>

Jinak nevím kde jinde bych si ho měl definovat. A adresářová struktura je skoro stejná jako v sandboxu, jen mám místo www, document_root.

Editoval loov (14. 5. 2011 19:39)

Patrik Votoček
Člen | 2221
+
0
-

dump(Nette\Environment::getContext()->getParam('tempDir')); ti vypíše co? Případně sem hoď laděnku ať víme kde přesně k tomu dochází.

loov
Člen | 49
+
0
-

takže dump(Nette\Environment::getContext()->getParam('tempDir')); vypíše tohle

„C:\Users\Martin\Documents\NetBeansProjects\sap\document_root/../temp“ (68)

Nechal jsem si to vypsat ve fci createCacheStorage() V třídě NConfigurator (libs/Nette/common/Configurator.php ř.385).

Laděnka:

<?php
...\libs\Nette\common\Configurator.php:386	 source ▼  NFileStorage->	 __construct (arguments ▼)

$dir
"%tempDir%/cache" (15)
$journal
NFileJournal(9) ▼ {
   "file" private => "C:\Users\Martin\Documents\NetBeansProjects\sap\document_root/../temp/btfj.dat" (77)
   "handle" private => stream resource
   "lastNode" private => 2
   "lastModTime" private => NULL
   "nodeCache" private => array(0)
   "nodeChanged" private => array(0)
   "toCommit" private => array(0)
   "deletedLinks" private => array(0)
   "dataNodeFreeSpace" private => array(0)
}
379:         */
380:        public static function createCacheStorage(IDiContainer $container)
381:        {
382:            $dir = $container->expand('%tempDir%/cache');
383:            umask(0000);
384:            @mkdir($dir, 0777); // @ - directory may exists
385:            NDebugger::dump(NEnvironment::getContext()->getParam('tempDir'));
386:            return new NFileStorage($dir, $container->getService('Nette\\Caching\\ICacheJournal'));
387:        }
388:
389:
390:
391:        /**
392:         * @return ICacheStorage
393:         */
...\libs\Nette\common\Callback.php:88	 source ▼  NConfigurator::	 createCacheStorage (arguments ►)

81:         */
82:        public function invoke()
83:        {
84:            if (!is_callable($this->cb)) {
85:                throw new InvalidStateException("Callback '$this' is not callable.");
86:            }
87:            $args = func_get_args();
88:            return call_user_func_array($this->cb, $args);
89:        }

...\libs\Nette\DI\Container.php:118	 source ▼  NCallback->	 invoke (arguments ►)

111:                list($factory) = $this->factories[$name];
112:                if (!$factory->isCallable()) {
113:                    throw new InvalidStateException("Unable to create service '$name', factory '$factory' is not callable.");
114:                }
115:
116:                $this->creating[$name] = TRUE;
117:                try {
118:                    $service = $factory->invoke($this);
119:                } catch (Exception $e) {}
120:
121:            } elseif (method_exists($this, $factory = 'createService' . ucfirst($name))) { // static method
122:                $this->creating[$name] = TRUE;
123:                try {
124:                    $service = $this->$factory();
125:                } catch (Exception $e) {}
...\libs\Nette\common\Configurator.php:435	 source ▼  NDiContainer->	 getService (arguments ►)

428:        /**
429:         * @return NRobotLoader
430:         */
431:        public static function createRobotLoader(IDiContainer $container, array $options = NULL)
432:        {
433:            $loader = new NRobotLoader;
434:            $loader->autoRebuild = isset($options['autoRebuild']) ? $options['autoRebuild'] : !$container->getParam('productionMode');
435:            $loader->setCacheStorage($container->getService('Nette\\Caching\\ICacheStorage'));
436:            if (isset($options['directory'])) {
437:                $loader->addDirectory($options['directory']);
438:            } else {
439:                foreach (array('appDir', 'libsDir') as $var) {
440:                    if ($dir = $container->getParam($var, NULL)) {
441:                        $loader->addDirectory($dir);
442:                    }
inner-code	 NConfigurator::	 createRobotLoader (arguments ▼)

$container
"Nette\Caching\ICacheStorage" (27)
inner-code:2	 call_user_func (arguments ►)

...\libs\Nette\common\Callback.php:88	 source ▼  __lambda_func (arguments ►)

81:         */
82:        public function invoke()
83:        {
84:            if (!is_callable($this->cb)) {
85:                throw new InvalidStateException("Callback '$this' is not callable.");
86:            }
87:            $args = func_get_args();
88:            return call_user_func_array($this->cb, $args);
89:        }

...\libs\Nette\DI\Container.php:118	 source ▼  NCallback->	 invoke (arguments ►)

111:                list($factory) = $this->factories[$name];
112:                if (!$factory->isCallable()) {
113:                    throw new InvalidStateException("Unable to create service '$name', factory '$factory' is not callable.");
114:                }
115:
116:                $this->creating[$name] = TRUE;
117:                try {
118:                    $service = $factory->invoke($this);
119:                } catch (Exception $e) {}
120:
121:            } elseif (method_exists($this, $factory = 'createService' . ucfirst($name))) { // static method
122:                $this->creating[$name] = TRUE;
123:                try {
124:                    $service = $this->$factory();
125:                } catch (Exception $e) {}
...\libs\Nette\common\Configurator.php:253	 source ▼  NDiContainer->	 getService (arguments ►)

246:                foreach ($config->mode as $mode => $state) {
247:                    $container->setParam($mode . 'Mode', (bool) $state);
248:                }
249:            }
250:
251:            // auto-start services
252:            foreach ($runServices as $name) {
253:                $container->getService($name);
254:            }
255:
256:            return $config;
257:        }
258:
259:
260:
...\libs\Nette\common\Environment.php:456	 source ▼  NConfigurator->	 loadConfig (arguments ►)

449:        /**
450:         * Loads global configuration from file and process it.
451:         * @param  string  file name
452:         * @return ArrayObject
453:         */
454:        public static function loadConfig($file = NULL)
455:        {
456:            return self::getConfigurator()->loadConfig(self::getContext(), $file);
457:        }

...\app\bootstrap.php:25	 source ►  NEnvironment::	 loadConfig (arguments ►)

18:    // Step 2: Configure environment
19:    // 2a) enable NDebug for better exception and error visualisation
20:    NDebugger::$strictMode = TRUE;
21:    NDebugger::enable(NDebugger::DEVELOPMENT);
22:
23:
24:    // 2b) load configuration from config.ini file
25:    NEnvironment::loadConfig();
?>

Ještě jsem nikdy před tím na nette fórum laděnku nedával tak snad to bude aspoň trochu čitelný.

Patrik Votoček
Člen | 2221
+
0
-

zkus ještě zaměnit dump(Nette\Environment::getContext()->getParam('tempDir')); za dump($container->getParam('tempDir')); mělo by to být stejné jako předchozí dump… ale jeden nikdy neví…

jinka když řeknu hoď sem laděnku myslím tím odkaz na stažení HTML souboru (i s JavaScriptem – aby fungoval expand) takhle se to blbě čte.

a ještě mě napadá holý nette sandbox ti funguje?

loov
Člen | 49
+
0
-

zaměněný dump vypisuje pořád stejný string „C:\Users\Martin\Documents\NetBeansProjects\sap\document_root/../temp“ (68)

ne ani holý nette sandbox mi nefunguje

ps: ok budu si to s tou laděnkou pamatovat pro příště

marek-m
Člen | 66
+
0
-

aj ja hlasim tuto chybu, na php5.2 pre nette 5.2, ak je vsak server na php5.3 nette pre 5.2 ide ok, napr. link:http://nette.itmava.eu/

Editoval marek-m (16. 5. 2011 10:25)

Aurielle
Člen | 1281
+
0
-

V DebugBaru vidím tohle:

1×
PHP Warning: config.neon: service name 'Nette\Loaders\RobotLoader' has been renamed to 'robotLoader' in /data/i/t/itmava.eu/sub/nette/data/libs/Nette/common/Configurator.php:151
marek-m
Člen | 66
+
0
-

ide o priklad z example Modules-Usage, aj ja to tam vidim :-), to security si nevsimajte link:http://nette.itmava.eu/…/config.neon

washo
Člen | 88
+
0
-

Vyresili jste nejak tento problem? Mam taky problem s tim, ze mi to nenacte do configu %tempDir% kdyz pouziju:

NEnvironment::loadConfig();

opravil jsem si to takto:

NEnvironment::setVariable('tempDir', TEMP_DIR);
NEnvironment::loadConfig();

ale myslim ze by to melo spravne fungovat i bez toho ??

V sandboxu s DI mi to funguje

PHP 5.2.17
Apache/2.2.19 (Win32) PHP/5.2.17
Nette Framework 2.0-beta (revision f2ae1ce released on 2011–06–22)

Editoval washo (22. 6. 2011 22:18)