Mode a environment, console vs. production vs. development

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

Ahojte.

Uz dlhsiu dobu intenzivne pracujem s cli pri mojich webovych aplikaciach. S hostingom a shell-om nemam problem, hostujem na vlastnych servroch, preto shell pri deploymente plne vyuzivam a povazujem to za nutnu podmienku pre deployment. Zakazku, ktoru by som mal riesit bez moznosti shell-u na production servri odmietnem.

Problem, ktory aktualne mam s implementaciou modes v Environment je ten, ze mode CONSOLE sa povazuje za rovnocenny stav k modom PRODUCTION a DEVELOPMENT, co je podla mna a mojej implementacie chyba a problem.

Cli a teda CONSOLE je len jeden sposob k pristupu k aplikacii. Aktualne hlavny subor, ktory nastavuje prostredie je u mna bootstrap.php. Tento subor sa vseobecne vyuziva vo vsetkych moznych pristupoch k aplikacii.

Mozne (a mnou pouzivane) pristupy k aplikacii:

  • cez http:// a webovy server, pristupovy bod je samozrejme index.php v document_root a nasledne bootstrap.php.
  • cez phpunit, ako bootstrap sa vyuziva bootstrap.php
  • vsetky cli skripty

CONSOLE mode je teda vyuzivany rovnako v production mode ako aj v development mode. A aby bolo mozne vyuzit silu konfiguracie, toto predstavuje problem, pretoze v CONSOLE mode je stale konfiguracia nastavena len pre blok [console], v aktualnom stave sa neda aplikovat rozlisenie PRODUCTION a DEVELOPMENT.

Pre ich uspesne nastavenie je potrebna IP, ktoru pri volani cez webserver je jednoducho dostupna cez $_SERVER, co samozrejme v cli nie je dostupne. V CLI ale celkom uspesne vyuzivam konstrukciu:

$addr = getHostByName(getHostName());

, ktora potom pri rovnakom algoritme ako to ma David implementovane pri autodetect-e pekne rozlisi development aj production pre CONSOLE mode. A tato konstukcia mi pekne funguje ako pod linuxom, tak pod windows.

Toto teda teraz obchadzam tym, ze v bootstrap-e pre CONSOLE natvrdo nastavujem Environment::setMode() a environment premennu ‚environment‘, tym padom mam aj v CONSOLE Mode spravny test Environment::isProduction(). A Environment::isConsole() ostava len ako test, co je spravne.

Teda zhrnutie mojich letanii na zaver, berte toto ako ziadost o zmenu a predtym samozrejme ako predmet na diskusiu:

  1. Mode bez ohladu nato, ci sa jedna o webrequest alebo CLI spustenie by vzdy vracal development/production.
  2. Na detekovanie ci sa jedna o CLI by ostalo aktualne Environment::isConsole().

S tymto suvisi aj fakt, ze blok [console] v config.ini by vlastne stratil zmysel. Ja ani neviem prist na situaciu, kedy by som to vyuzil, pouzivate to vy ?

srigi
Nette Blogger | 558
+
0
-

Osobne som sa s tymto tiez stretol a ja by som dokonca potreboval v configu rozlisenie na consoleDevelopment a consoleProduction.

pekelnik
Člen | 462
+
0
-

Toto je poměrně dlouhodobá záležitost… Osobně bych byl také pro. David argumentuje tím že mód můžeš podstrčit parametrem. php index.php --mode production

Patrik Votoček
Člen | 2221
+
0
-

tak o této možnosti slyším poprvé

edke
Člen | 198
+
0
-

pekelnik wrote:

Toto je poměrně dlouhodobá záležitost… Osobně bych byl také pro. David argumentuje tím že mód můžeš podstrčit parametrem. php index.php --mode production

Ale v zmysle, ze si to mam dalej sam spravovat ako argument, alebo sa o takuto detekciu stara sam Environment ? Ale v oboch pripadoch → tak to dakujem pekne :) Radsej to budem detekovat automaticky cez IP adresu hostu v bootstrap-e, ak ako to riesim teraz.

Editoval edke (24. 3. 2011 14:50)

Elijen
Člen | 171
+
0
-

pekelnik napsal(a):

Toto je poměrně dlouhodobá záležitost… Osobně bych byl také pro. David argumentuje tím že mód můžeš podstrčit parametrem. php index.php --mode production

Právě tento problém řeším a --mode prouction mi bohužel nefunguje. Vypadá to, že ho Nette (2.0 beta) ignoruje. Ta automatická detekce prostředí je tak trochu dvousečná zbraň. Mnohem lepší mi přijde detekce prostředí ala Zend Framework, kde se nastavení provádí pomocí environment proměnné apache.

Osobne som sa s tymto tiez stretol a ja by som dokonca potreboval v configu rozlisenie na consoleDevelopment a consoleProduction.

+1

Editoval Elijen (22. 11. 2011 11:57)

Patrik Votoček
Člen | 2221
+
0
-

Elijen napsal(a):

Mnohem lepší mi přijde detekce prostředí ala Zend Framework, kde se nastavení provádí pomocí environment proměnné apache.

K čemu ti bude environment proměnná v Apache u CLI scrpitu? :-)

BTW nic ti nebrání si to implementovat:

$container = $configurator->loadConfig(__DIR__ . "/config.neon", isset($_ENV['mode']) ? $_ENV['mode'] : NULL);

Osobne som sa s tymto tiez stretol a ja by som dokonca potreboval v configu rozlisenie na consoleDevelopment a consoleProduction.

Jak chceš tyhle dva módy detekovat?

paranoiq
Člen | 392
+
0
-

ad „--mode production“ – je obvyklé, že konzolové nástroje mají právě debug mód (nikoliv produkční) aktivován parametrem


bylo by asi nejlepší celou tuhle detekci módů vytrhnout z Nette\Configurator a ostatních míst a umožnit její překrytí vlastní implementací


pár poznámek (hlavně pro mě, abych si to srovnal v hlavě. ve většině to odpovídá současnému přístupu Nette):

celá věc okolo módů atd má tři rozměry:

  1. způsob zpracování vstupů/výspupů/chyb: http | http/ajax | console
  2. režim zobrazení chyb: user | developer (production | development)
  3. konfigurace prostředí (hesla, adresy, služby…): stroj vývojáře | staging | produkce

bod 1. nijak nesouvisí s 2. a 3.

bod 2. a 3. spolu ne úplně souvisí – pro vývojáře je občas nutné fixnout něco na produkci v development režimu, nebo naopak prohlédnout chybové stránky na vývojovém stroji v production režimu. na stagingu je také třeba oboje

detekce 1. je celkem jasná

detekovat režim 2. na http je snadné (localhost nebo výčet adres vývojářů), ale mělo by jít autodetekci obejít (např. cookie od uživatele s definovanou IP adresou – vývojáře). v konsoli bych zvolil jako defaultní production a development rozpoznával parametrem (třeba --debug)

jméno prostředí 3.,

  1. buď musí přijít z konfigurace – což souvisí s includováním NEON souborů, které není dořešeno (třeba local.neon)
  2. nebo naopak přijde od stroje na kterém aplikace běží a ovlivní konfiguraci (php_uname() nebo getHostName())

byl bych spíš pro b) – na základě jména stroje rozhodnout co z konfigurace načíst. což je v podstatě současný stav

Elijen
Člen | 171
+
0
-

Patrik Votoček napsal(a):

K čemu ti bude environment proměnná v Apache u CLI scrpitu? :-)

Jasně, tohle by se muselo detekovat zas nějak jinak. Třeba přes environment proměnnou shellu.

BTW nic ti nebrání si to implementovat:

Implementované to mám. Zatím provizorně podle hodnoty getHostName(), ale problém není pouze v načtení správného configu. (paranoiq to vystihl vcelku dobře) Nevidím uplně do vnitřností frameworku, tak jsem se omezil na předání sekce metodě loadConfig(). Až bude čas, tak se pokusím sesmolit nějaké finální řešení.

David Grudl
Nette Core | 8216
+
0
-

Podle paranoiqa jsem detekci režimu development/production zjednodušil tak, že jen 127.0.0.1 (nebo ::1) se považuje za development, vše ostatní (včetně console režimu) jako production.

V případě konzolových aplikací mi připadá vhodnější používat přepínač v příkazové řádce než nějakou magii.

Zároveň jsem vyhodil sekci ‚console‘ z konfiguráku, takže konzolová aplikace bude standardně jako production.

Dalibor
Člen | 26
+
0
-

David Grudl napsal(a):

Podle paranoiqa jsem detekci režimu development/production zjednodušil tak, že jen 127.0.0.1 (nebo ::1) se považuje za development, vše ostatní (včetně console režimu) jako production.

Dá se nějak Nette natlačit development mód nasílu? Já používám vývojový server na 192.168.0.0 síti a tento „upgrade“ mi zamíchal s kartama.. A to jsem se už popral s novým pojetím konfiguráku.. ;-)

Aurielle
Člen | 1281
+
0
-

Jde ti o Laděnku nebo o načítání config.neon?

Laděnka:

Nette\Diagnostics\Debugger::enable(Nette\Diagnostics\Debugger::DEVELOPMENT);

Načítání configu:

$configurator->loadConfig(__DIR__ . '/config.neon', 'development');
David Grudl
Nette Core | 8216
+
+1
-

Pro konfiguraci takto:

$configurator->setProductionMode(FALSE);
David Grudl
Nette Core | 8216
+
+1
-

Pokud by někdo nerozuměl, proč se Laděnka a konfigurator nastavují odděleně, je to z toho důvodu, že Laděnka souvisí s laděním, konfigurace s tím, kde aplikace běží a jak se chová. I na ostrém serveru lze ladit a stejně tak i na vývojářské mašině nás zajímá, jak se aplikace chová v ostrém provozu.

Dalibor
Člen | 26
+
0
-

Aha, díky, nevěděl jsem, že se nastavuje zvlášť laděnka a konfigurace..

Dalibor
Člen | 26
+
0
-

Tohle ruční editování ale stejně řeší problém jen částečně, protože budu muset detekovat production/development mód sám.. Jak píše Paranoiq:

„bylo by asi nejlepší celou tuhle detekci módů vytrhnout z Nette\Configurator a ostatních míst a umožnit její překrytí vlastní implementací“

by asi opravdu bylo nejlepší..

urbasekd
Člen | 1
+
0
-

Já přistupuju k CLI pomocí ANTu jak na produkčním serveru, tak na svým počítači, a tak jsem chtěl automatickou detekci prostředí (nastavení databáze) i u CLI. Napsal jsem to do bootstrapu takto:

if (PHP_SAPI == 'cli' && Nette\Utils\Strings::startsWith(getHostByName(getHostName()), "192.168."))
	$configurator->addConfig(__DIR__ . '/config/config.neon', $configurator::DEVELOPMENT);
else
	$configurator->addConfig(__DIR__ . '/config/config.neon');

Možná to není ideální řešení, ale funguje to.