Jak na CLI v poslední revizi Nette?

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

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.

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
+
0
-
  1. 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… :-)

  1. 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
  1. „drobnost“
// místo
if (NEnvironment::isConsole())
// použij
if ($container->params['consoleMode'])

Snad jsem na nic nezapoměl… :-)

maarlin
Člen | 207
+
0
-

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

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

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

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)