Jak na CLI v poslední revizi Nette?
- maarlin
- Člen | 207
bootstrap.php:
<?php
// Load Nette Framework
$params['libsDir'] = dirname(__FILE__) . '/../libs';
require $params['libsDir'] . '/Nette/loader.php';
// Enable Nette Debugger for error visualisation & logging
NDebugger::$logDirectory = $params['wwwDir'] . '/log';
NDebugger::$strictMode = TRUE;
NDebugger::enable(NDebugger::PRODUCTION);
// Load configuration from config.neon file
echo "Line 1 OK\n";
$configurator = new NConfigurator;
echo "Line 2 OK\n";
$configurator->container->params += $params;
echo "Line 3 OK\n";
$configurator->container->params['tempDir'] = dirname(__FILE__) . '/../temp';
echo "Line 4 OK\n";
$container = $configurator->loadConfig(dirname(__FILE__) . '/config.neon');
echo "Line 5 OK\n";
// Setup router
$router = $container->router;
if (NEnvironment::isConsole()) {
$router[] = new NCliRouter();
} else {
$router[] = new NRoute('index.php', 'Homepage:default', NRoute::ONE_WAY);
$router[] = new NRoute('<presenter>/<action>[/<id>]', 'Homepage:default');
}
// Configure application
$application = $container->application;
//$application->catchExceptions = TRUE;
$application->errorPresenter = 'Error';
// Run the application!
$application->run();
?>
Když aplikaci pustím skrz prohlížeč, vypíše bez problémů Line 1–5 OK a načte a vypíše Homepage presenter.
Pokud je aplikace spuštěna skrz CLI
php -f index.php
Tak zařve
Line 1 OK
Line 2 OK
Line 3 OK
Line 4 OK
ERROR: the server encountered an internal error and was unable to complete your request.
Do logu se nic nezapíše.
V config.neon by nemělo být nic neobvyklého…
common:
php: # PHP configuration
date.timezone: UTC
# session.save_path: "%tempDir%/sessions"
# zlib.output_compression: yes
services:
robotLoader:
run: true
production < common:
development < common:
console < common:
Co bych měl ještě změnit, abych mohl spustit aplikaci skrz CLI?
Editoval maarlin (16. 7. 2011 15:43)
- Patrik Votoček
- Člen | 2221
- němělo by:
NDebugger::$logDirectory = $params['wwwDir'] . '/log';
// spíš být:
NDebugger::$logDirectory = $params['wwwDir'] . '/../log';
Nejspíš ti to logu nic nezapíše protože ta složka neexistuje… :-)
- Je logické že dojde k vyjímce a to na 99% k:
Nette\InvalidStateException
Missing presenter.
protože nemáš definován výchozí CLI presenter / akci a spouštíš bez jeho udání… :-)
//takže místo:
$router[] = new NCliRouter();
//
$router[] = new NCliRouter('CLI:default'); // nebo tak něco
- „drobnost“
// místo
if (NEnvironment::isConsole())
// použij
if ($container->params['consoleMode'])
Snad jsem na nic nezapoměl… :-)
- maarlin
- Člen | 207
Patrik Votoček napsal(a):
Ad.1) Určitě ne, cesta je dobře, když záměrně způsobím nějaký problém (třeba nechám zavolat neexistující fci) a načtu aplikaci skrz prohlížeč, chyba se normálně zaznamená. Používám takovou adresářovou strukturu. Čili tam problém nebude.
Ad. 2) Good point, opravil jsem na
$router[] = new NCliRouter('Homepage:default');
Ad. 3) dobrá připomínka, opravil jsem, možná by stálo za to tohle opravit v https://pla.nette.org/…tovani-v-cli
Přesto se stav nezměnil. Jak jsem psal, nevypíše se „Line 5 OK\n“, tzn. k problému s největší pravděpodobností dochází na řádku s načtením neonového configu:
$container = $configurator->loadConfig(dirname(__FILE__) . '/config.neon');
Ale nedokážu dohledat k jakému problému tam dochází.
Editoval maarlin (16. 7. 2011 17:30)
- Patrik Votoček
- Člen | 2221
zkus si ještě před nebo za řádek s definicí CLI routy přidat:
$application->allowedMethods = FALSE;
v tutu to opravím. již se tak stalo
EDIT: nicméně to tvůj problém asi ani tak nevyřeší. Zkus si vynutit DEVELOPMENT / PRODUCTION prostředí u laděnky. Třeba ti řekne víc…
Teď mě ještě napadlo máš v config.neon sekci
console
?
- maarlin
- Člen | 207
Pomohlo vynucení DEVELOPMENT prostředí.
Taková začátečnická chyba… sypu si popel na hlavu.
exception 'InvalidStateException' with message 'Unable to write to directory '/var/www/project/app/../temp/cache'. Make this directory writable.'
Edit: Totiž když se spouští index.php skrz konzoli, spouští se přihlášeným uživatelem a ne apachem, tudíž pokud nemá adresář s /temp/cache nastavená úplná práva (rwxrwxrwx == 777), nebo alespoň přihlášený uživatel není ve stejné jako apache a není nastaveno alespoň rwxrwx---, tak ho to tam logicky nepustí.
Jinak nechci být neuctivý, ale taky bych už čekal, že to bude fungovat bez té obezličky. :))
$application->allowedMethods = FALSE;
Že by se to automaticky nastavovalo pro consoleMode…
Jinak moc dobrá práce na výkonu na nové verzi!
Starší verze skoro čistého Nette skeletonu se načítaly na stejném serveru desítky, ne-li stovku ms, aktuálně? 6.5ms… :)) Fakt dobrý!
Patrik Votoček EDIT: odstraněna zbytečná citace
Editoval maarlin (16. 7. 2011 22:16)
- Patrik Votoček
- Člen | 2221
maarlin napsal(a):
Jinak nechci být neuctivý, ale taky bych už čekal, že to bude fungovat bez té obezličky. :))
$application->allowedMethods = FALSE;
Že by se to automaticky nastavovalo pro consoleMode…
Až bude trocha času mrknu na to a kdyžtak pošlu pull… :-) (pak už nezbude než čekat)