Premenné prostredia použité v konfigurácii sú zďaleka hlavnou metódou nastavenia nastavení v aplikácii, ako sú poverenia databázy, kľúče API, tajné kľúče a všetko, sa líši v závislosti od toho, kde je aplikácia nasadená. Teraz sa takéto nastavenia dostávajú do kódu cez prostredie, namiesto toho, aby boli priamo predpísané v konfiguračných súboroch alebo, čo je ešte horšie, napevno zakódované priamo v kóde.
Poďme sa na to pozrieť bližšie:
- ako to funguje?
- je to naozaj dobrý nápad?
- ako s nimi pracovať v PHP?
- a nakoniec niekoľko tipov a bežných chýb, ktorým sa treba vyhnúť – nástrahy, na ktoré sme v skutočnom svete narazili!
Nebudeme sa zaoberať tým, ako nastaviť premenné prostredia na webovom serveri/docker/crontab...pretože to závisí od systému, softvéru a my sa chceme zamerať na samotné premenné prostredia.
Ak váš hostiteľ používa Docker Swarm alebo AWS , veci budú trochu iné, napríklad preto, že sa rozhodnú vložiť súbory do súborového systému vášho kontajnera na vloženie vašich súkromných kľúčov namiesto použitia premenných prostredia. Toto je veľmi špecifické pre tieto platformy a nie je to bežná možnosť pre každého.
Env vars 101
Keď sa program spustí, zdedí všetky premenné prostredia od svojich rodičov. Takže ak nastavíte premennú YOLO na covfefe v bash a potom spustíte príkaz, môžete čítať YOLO v akomkoľvek podradenom procese.
$ YOLO=covfefe php -r "echo getenv("YOLO");" covfefe
Keďže táto premenná je definovaná iba lokálne, nemôžeme ju čítať z iného terminálu (iného rodiča). Cieľom je zabezpečiť, aby vaša aplikácia vždy zdedila správne premenné.
Všetky premenné prostredia môžete zobraziť na príkazovom riadku spustením nasledujúceho príkazu, ale premennú YOLO neuvidíte, pretože bola odovzdaná iba za behu príkazu php, nie je nastavená v aktuálnom procese:
Pomocou exportu môžete nastaviť premennú prostredia<имя>=<значение> :
$ export YOLO=covfefe
V názvoch premenných sa rozlišujú malé a veľké písmená a zvykom je používať iba anglické názvy písané veľkými písmenami s _ ako oddeľovačom (takzvaný „hadovitý“ štýl vo veľkých písmenách). Pravdepodobne už poznáte niektoré premenné - ako PATH, DISPLAY, HTTP_PROXY ...
Osvedčené postupy pre dnešok
josegonzalez/dotenv , zameraný na bezpečnosť:
Táto knižnica štandardne nezapĺňa superglobály:
$Loader = new josegonzalez\Dotenv\Loader("cesta/k/.env"); // Analýza súboru.env: $Loader->parse(); // Odoslať výsledok parsing.env do premennej $_ENV: $Loader->toEnv();
Podporuje povinné premenné, filtrovanie a môže vyvolať výnimky, keď je premenná prepísaná.
symfony/dotenv , nové dieťa v odbore:
Dostupné od Symfony 3.3. Tento komponent sa stará o súbor .env ako ostatné a napĺňa aj superglobály:
$dotenv = new Symfony\Component\Dotenv\Dotenv(); $dotenv->load(__DIR__."/.env"); $dbUser = getenv("DB_USER"); $dbUser = $_ENV["DB_USER"]; $dbUser = $_SERVER["DB_USER"];
Nemali by ste ho používať na získanie svojich hodnôt, preto vám navrhujem, aby ste namiesto toho pristupovali k $_SERVER – navyše existuje malý výkonnostný rozdiel medzi prístupom k poli a volaním funkcie v prospech polí.
Premenné prostredia sú vždy reťazce
Jedným z hlavných problémov je, že PHP má teraz typy a naše nastavenia nie sú vždy správne napísané.
Trieda Db ( public function connect(string hostname, int port) ( ) ) // Toto nebude fungovať: $db->connect($_SERVER["DATABASE_HOSTNAME"], $_SERVER["DATABASE_PORT"]);
V Symfony teraz môžete transformovať premenné a ešte viac - čítať súbor, dekódovať json...…
Premenné prostredia všade alebo nie
V súčasnosti existuje veľa diskusií medzi používaním premenných prostredia, súborov alebo ich zmesi: premenná prostredia odkazuje na konfiguračný súbor. Ide o to, že aj keď sa to považuje za najlepší postup, premenné prostredia neponúkajú veľa výhod...
Ak sa však použije správne, napríklad v aplikácii Symfony je možné premenné prostredia meniť za chodu – bez vymazania akejkoľvek vyrovnávacej pamäte, bez prístupu k súborovému systému, bez nasadenia kódu: napríklad jednoducho reštartovaním procesu.
Trend mať iba jednu premennú, napríklad APP_CONFIG_PATH a čítať ju cez „%env(json:file:APP_CONFIG_PATH)%“ mi pripadá ako znovuobjavenie starých dobrých parametrov.yml, pokiaľ súbor nie je automaticky spravovaný dôveryhodným nástrojom ( ako tajný obchod AWS). A je tu aj envkey.com, ktorý vám umožňuje spravovať premenné prostredia z jedného miesta bez toho, aby ste sa sami museli zaoberať súbormi. Páči sa mi tento prístup, pretože je oveľa jednoduchší!
Tesne pred spustením skriptu mu server odovzdá niektoré premenné prostredia s informáciami. Niektoré premenné obsahujú niektoré hlavičky, ale nie všetky (nemôžete získať všetky hlavičky).
HTTP_ACCEPT- Táto premenná zobrazuje všetky typy údajov MIME, ktoré môže prehliadač akceptovať. Riadok */* znamená, že prehliadač rozumie akémukoľvek typu.
HTTP_ACCEPT= */*
HTTP_REFERER- Táto premenná predstavuje informácie o stránke, z ktorej sa používateľ na túto stránku dostal. Túto premennú je možné použiť napríklad na sledovanie pohybu používateľa na vašej stránke a následné zobrazenie najobľúbenejších trás.
HTTP_REFERER= http://www.spravkaweb.ru/
HTTP_COOKIE- Táto premenná ukladá všetky súbory cookie zakódované v URL.
HTTP_COOKIE=
HTTP_USER_AGENT- Identifikuje prehliadač používateľa. Ak chcete určiť typ prehliadača, musíte v tomto reťazci skontrolovať prítomnosť slov: ak je prehliadač Internet Explorer, potom bude prítomný podreťazec MSIE a ak je prítomné iba slovo Mozilla, potom je to Netscape.
HTTP_USER_AGENT= Mozilla/4.0 (kompatibilný; MSIE 5.0; Windows NT 4.0)
Máte Internet Explorer?
HTTP_HOST- Obsahuje názov domény webového servera, na ktorom bol skript spustený. Túto premennú je celkom vhodné použiť napríklad na vygenerovanie úplnej cesty, ktorá sa vyžaduje v hlavičke Location, aby nebola viazaná na konkrétny server.
HTTP_HOST= www.spravkaweb.ru
HTTP_FROM- E-mailová adresa používateľa, ktorý odoslal požiadavku.
HTTP_FROM=
NÁZOV SERVERA- Názov domény alebo IP adresa servera.
SERVER_NAME= www.spravkaweb.ru
SERVER_SOFTWARE- Názov a verzia serverového programu, ktorý odpovedá na požiadavku klienta.
SERVER_SOFTWARE= Apache/1.3.33 (Unix) mod_jk/1.2.8 mod_auth_passthrough/1.8 mod_log_bytes/1.2mod_bwlimited/1.4 FrontPage/5.0.2.2635 mod_ssl/2.8.22 OpenSSL/0.9.7a PHP-CGI
PORT SERVERA- Táto premenná obsahuje port servera, ku ktorému pristupuje prehliadač používateľa. Zvyčajne je to 80. Premennú je možné použiť aj na vytvorenie parametra hlavičky Location.
SERVER_PORT= 80
SERVER_PROTOCOL- Premenná obsahuje názov a verziu informačného protokolu, ktorý bol použitý pre požiadavku.
SERVER_PROTOCOL= HTTP/1.0
REMOTE_ADDR- Táto premenná obsahuje IP adresu (alebo názov domény) hostiteľa používateľa, kde bol prehliadač spustený.
REMOTE_ADDR= 212.94.114.177
REMOTE_PORT- Port, ktorý je priradený prehliadaču používateľa na prijímanie odpovede servera.
REMOTE_PORT= 4277
REMOTE_USER- Identifikačné meno užívateľa odosielajúceho požiadavku.
REMOTE_USER=
SCRIPT_NAME- Obsahuje názov súboru obsahujúceho tento skript. Túto premennú je vhodné použiť pri generovaní hlavičky Location pri presmerovaní na seba (self-redirect), ako aj na nahradenie hodnoty atribútu action značky
Osobný účet poistenca
Automatický identifikačný systém Spoločné používanie AIS s elektronickým mapovým systémom
Wargame: Red Dragon sa nespúšťa?
Smutný escobar „Tvár súdneho systému Ukrajiny“
ROME Total War - ako odomknúť všetky frakcie?