Detekce běhu prostředí v konzoli

RePRO
Člen | 32
+
0
-

Ahoj,

omlouvám se předem za tuto obecnou otázku, protože se netýká až tolik Nette, jako konfigurace, či konzole. Nicméně mě zajímá, jaký k tomu máte názor, případně jak to řešíte. V samotném souboru bootstrap.php jsme kdysi dávno používali:

if (strpos($_SERVER['HTTP_HOST'], 'localhost') !== false) {
	$configurator->addConfig(__DIR__ . '/config/cnf.local.neon');
}
else {
	$configurator->addConfig(__DIR__ . '/config/cnf.production.neon');
}

Naprosto v pohodě zdrojový úryvek do té doby, než jsme začali používat konzoli, přes kterou spouštíme některé automatické úlohy, typicky – crony.

Od té doby máme v bootstrapu na produkci natvrdo jeden řádek. A proč? Protože konzole zavolá na produkci cnf.local.neon.

$configurator->addConfig(__DIR__ . '/config/cnf.production.neon');

Otázka tedy zní, jakým způsobem rozlišit, zda jsem lokálně či na produkci v konzoli?

Nutno poznamenat, že jsme si zkoušeli v konzoli vypsat, co je například v globální proměnné $_SERVER. Nic… žádné jméno serveru, nic takového. Možná špatně nastavený server?

Mě třeba osobně napadlo si na ten server zapsat proměnnou, kterou bychom poté měli v poli $GLOBALS. Jenže víte jak, kolikrát nemáte ani plný přístup na server, jako je root a podobně. Přenositelnost takové aplikace je potom na prd. Ještě poznamenám, že momentálně využíváme konzoli contributte/console.

Nedá se třeba něco speciálně nastavit v samotné konfiguraci té konzole?

A ještě jedna věc, k deploy – pouštíte na produkční server i ten lokální soubor?

Předem díky za konstruktivní poznatky.

Editoval RePRO (28. 4. 2021 18:23)

Marek Bartoš
Nette Blogger | 1274
+
+2
-

Konzoli rozlišíš pomocí if(PHP_SAPI === 'cli'){}

Ifování různých serverů (lokální, staging, produkce, PR #46468) však není dobrý nápad – spousta podmínek, které boostrap komplikují a v každém prostředí je vše až na jednu branch dead code. config.local.neon by měl představovat config aktuálního serveru a bootstrap vždy includuje právě ten. Docílit toho lze tak, že při deployi, před nahráním souborů na server přejmenuješ config.production.neon na config.local.neon. Ze všech configů specifických pro různé servery nahraješ jen ten.

Nutno poznamenat, že jsme si zkoušeli v konzoli vypsat, co je například v globální proměnné $_SERVER. Nic… žádné jméno serveru, nic takového. Možná špatně nastavený server?

Konzole o webovém serveru nic neví, netvoří http request. Nic specifické pro http tedy v $_SERVER nenajdeš.

Editoval Mabar (28. 4. 2021 18:33)

RePRO
Člen | 32
+
0
-

Mabar napsal(a):

Konzoli rozlišíš pomocí if(PHP_SAPI === 'cli'){}

Ifování různých serverů (lokální, staging, produkce, PR #46468) však není dobrý nápad – spousta podmínek, které boostrap komplikují a v každém prostředí je vše až na jednu branch dead code. config.local.neon by měl představovat config aktuálního serveru a bootstrap vždy includuje právě ten. Docílit toho lze tak, že při deployi, před nahráním souborů na server přejmenuješ config.production.neon na config.local.neon. Ze všech configů specifických pro různé servery nahraješ jen ten.

Nutno poznamenat, že jsme si zkoušeli v konzoli vypsat, co je například v globální proměnné $_SERVER. Nic… žádné jméno serveru, nic takového. Možná špatně nastavený server?

Konzole o webovém serveru nic neví, netvoří http request. Nic specifické pro http tedy v $_SERVER nenajdeš.

Díky za poznatek.

Konzoli rozlišíš pomocí if (PHP_SAPI === 'cli') {}

Ano, ale to nám pouze říká, jestli je to spuštěno z konzole, či nikoliv. Rozlišení toho ifu nikoliv. Takže zůstaneme u toho jednoho souboru na serveru. :-) Zkrátka to není možné „hezky“ přes konzoli detekovat.

Editoval RePRO (28. 4. 2021 18:39)

Marek Bartoš
Nette Blogger | 1274
+
0
-

Konzoli rozlišíš pomocí if (PHP_SAPI === ‚cli‘) {}

To jsem psal pro případ, že bys chtěl nějakou konfiguraci při běhu v konzoli mít jinak, ne kvůli rozlišení serveru

IJVo
Člen | 38
+
-3
-

Ahoj,
já to používám, tak, jak jsem již dříve psal zde

A config.local.neon na produkci nepřenáším -ten tam nemá co dělat :-)

ViPEr*CZ*
Člen | 817
+
0
-

Pokud se nepletu, tak Symfony/Console to dělá přes přepínač. Tj. je tam nějaký default a přes --env=development můžete říci, že to běží v development environmentu. Tj. bude to chtít zavést něco obdobného zde a chytit si to v bootstrapu pro rozlišení toho, jaký config chcete loadovat.

Editoval ViPEr*CZ* (29. 4. 2021 10:56)