10.4. Vides mainīgie Kad Unix programma darbojas, tai pieejamajā vidē ir iekļauta nosaukuma un vērtības attiecību kopa (gan nosaukumi, gan vērtības ir virknes). Dažus no tiem lietotājs instalē manuāli, citus instalē sistēma laikā
10.4.1. Sistēmas vides mainīgie Ir daudzi labi zināmi vides mainīgie, ko programma var iegūt, palaižot to no Unix čaulas. Šie mainīgie (īpaši HOME) bieži ir jānovērtē pirms lokālā faila lasīšanas
autors Robins Arnolds
10.4.2. Pielāgoti vides mainīgie Lai gan lietojumprogrammas var brīvi interpretēt vides mainīgos ārpus sistēmas noteiktās kopas, šādas funkcijas faktiskā izmantošana pašlaik ir diezgan neparasta.
No autora grāmatas 10.4.3. Kad lietot vides mainīgos Lietotāju un sistēmas vides mainīgajiem ir kopīgs fakts, ka tie satur datus, kas tiek glabāti lielos daudzumos konfigurācijas faili tas būtu garlaicīgi. Un ārkārtīgi nogurdinoši
No autora grāmatas 14.4. Vides mainīgie Dažkārt ir nepieciešams piekļūt vides mainīgajiem, kas ir saikne starp programmu un ārpasauli. Vides mainīgie ir vienkārši etiķetes, kas saistītas ar kādu tekstu (parasti mazs); viņi glabā, piemēram, ceļus uz
No autora grāmatas Funkcijas un mainīgie. Vietējie mainīgie Iepriekš deklarētās funkcijas savā ķermenī izveido savus mainīgos. Tie ir tā sauktie vietējie mainīgie. Šādi mainīgie ir pieejami tikai tajā funkcijas pamattekstā, kurā tie ir deklarēti. Kad izpilde ir pabeigta
No autora grāmatas 22.3.3. Vides mainīgie Programmās, kurās tiek izmantotas setuid vai setgid iespējas, īpaša uzmanība jāpievērš vides iestatījumiem. Šos mainīgos nosaka lietotājs, kurš aktivizējis programmu, tādējādi atverot durvis uzbrukumiem. Acīmredzamākais uzbrukums
No autora grāmatas Vides mainīgie Vides mainīgie ir globāli sistēmas iestatījumi, kas tiek izmantoti sākotnējās sāknēšanas laikā. operētājsistēma. Operētājsistēmās Windows, Linux un lielākajā daļā UNIX sistēmas Firebird serveris atpazīst un izmanto dažus vides mainīgos, ja tādi ir
No autora grāmatas Kur ir iestatīti Windows vides mainīgie Vides mainīgo veids un to iestatīšanas veids atšķiras? Windows versijas uz citu. Tabulā Tabulā 3.1 ir parādīti vides mainīgo vērtību veidi (ja tādi ir) un metodes 3.1. tabulā. Vides mainīgā iestatījumi priekš
No autora grāmatas 2. nodaļa Argumenti, opcijas un vides mainīgie Jebkuras programmas pirmais uzdevums parasti ir interpretēt komandrindas opcijas un argumentus. Šajā nodaļā ir apskatīts, kā C (un C++) programmas saņem komandrindas argumentus, aprakstot standartu
Šis ir īss norādījums par PHP pakalpojuma konfigurācijas ieviešanu atkarībā no vides, kurā tas darbojas. Priecāšos, ja kāds ieteiks kādu elegantāku risinājumu vai labos sīkumos.
galvenā ideja
Palaidiet pakalpojumu, mikropakalpojumus un atkarīgās lietojumprogrammas tajā pašā ekosistēmā, kas konfigurēta, izmantojot vides mainīgos. Problēma
Šajā rakstā pārāk daudz reižu tiek atkārtots "vides mainīgie".
No kastes php-fpm ignorē globālos vides mainīgos (funkcija getenv), savukārt php cli var tos saņemt. Fons
Varat izlaist šo sadaļu, ja jau esat strādājis ar .env
IN šobrīd Es strādāju pie projekta, kas rakstīts ZF2. Lai konfigurētu projektu, tika izmantoti konfigurācijas faili dažādām vidēm. Tas rada liels skaits dublēt konfigurācijas projekta repozitorijā, piemēram: - session.global.php
- session.local.php.dist
- session.unittest.php.dist
- db.global.php
- db.local.php.dist
- db.unittest.php.dist
Šie dublikāti ir pastāvīgi jāsinhronizē viens ar otru. Turklāt viņi sevī glabā noteiktu PHP loģiku, kas rada koda dublēšanos. Tātad projektā tagad ir ņemta vērā vide, bet...
Kamēr izstrāde tika veikta uz darba mašīnām, projekts nolasīja .env failu un viss strādāja. Bet, kad es izvietoju testa vidi, izrādījās, ka, iestatot reālus sistēmas vides mainīgos, php-fpm tos ignorē. Dažādas Google un StackOverflow receptes ir saistītas ar vienu vai otru divu labi zināmu metožu izmantošanas automatizāciju: 1. Mainīgo nodošana caur nginx, izmantojot fastcgi_param parametru SOMEENV testu;
2. Mainīgo iestatīšana env formātā php-fpm darbinieka procesa pūla konfigurācijā.
Gan pirmā, gan otrā iespēja ir ērta dažām īpašām situācijām. Bet, ja domājat pēc paradigmas "vides, nevis lietojumprogrammas konfigurēšana", tad šādas metodes izrādās daudz grūtākas nekā, piemēram, vienkārši ievietot .env failu projekta mapē. Bet orķestrētājs, CI sistēma vai vienkārši sistēmas administrators nevajadzētu zināt projekta īstenošanas detaļas, tas nav eleganti.
Ieteiktais risinājums
Apvienojot dažādas receptes no interneta, atradu šādu darba risinājumu.
Pārbaudīts ar Centos 7, PHP 5.6.14. 1. Atveriet /etc/php.ini - Replace variables_order = "GPCS" ar variables_order = "EGPCS" # Pēc tam PHP pievienos vides mainīgos globālajai telpai # http://php.net/manual/ru/ini. core.php #ini.variables-order 2. Atveriet /etc/php-fpm.d/www.conf, ko nedrīkst sajaukt ar /etc/php-fpm.conf (in dažādas sistēmas var atrasties dažādās vietās, šī ir www procesa pūla konfigurācija php-fpm. - Pievienot (vai aizstāt, ja ir): clear_env = nē # atspējot globālo mainīgo notīrīšanu palaistajiem darbiniekiem 3. Iestatiet nepieciešamos vides mainīgos mapē /etc/environment (standarta sintakse A=B) 4. ln -fs /etc/environment / etc/sysconfig/php-fpm # tagad php-fpm pakalpojuma vides mainīgais config vienkārši būs saite uz globālo konfigurāciju 5. systemctl daemon-reload && service php-fpm restart
Tāda pati pieeja ar simbolisku saiti teorētiski ir piemērojama citiem pakalpojumiem.
Piedāvātā risinājuma priekšrocības:
- /etc/environment saglabātie mainīgie ir pieejami dažādām lietojumprogrammām. Varat izsaukt echo $MYSQL_HOST čaulā vai getenv ("MYSQL_HOST") php.
- Vides mainīgie, kas nav skaidri iestatīti mapē /etc/environment, nenonāks php-fpm. Tas ļauj orķestrim kontrolēt vidi ārpus izolētas sistēmas, kurā darbojas pakalpojums.
Mīnusi:
- Diemžēl es neatradu php-fpm darbojošos komandu pārlādēšanai, līdzīgi kā nginx, tāpēc, ja maināt /etc/environment, jums tas jādara systemctl daemon-reload && service php-fpm restart.
Svarīgi: ja jūsu lietojumprogramma nedarbojas izolētā vidē (serveris, virtuālā mašīna, konteiners), vides mainīgo definēšana var neparedzami ietekmēt blakus esošos pakalpojumus sistēmā, jo nosaukums atbilst globālajā telpā.
Konfigurācijā izmantotie vides mainīgie mūsdienās ir galvenā lietojumprogrammas iestatījumu iestatīšanas metode, piemēram, datu bāzes akreditācijas dati, API atslēgas, slepenās atslēgas un viss pārējais. atšķiras atkarībā no lietojumprogrammas izvietošanas vietas. Tagad šādi iestatījumi nokļūst kodā caur vidi, nevis tiešā veidā tiek ierakstīti konfigurācijas failos vai, vēl ļaunāk, iekodēti tieši kodā.
Apskatīsim tuvāk:
- Kā tas darbojas?
- vai tā tiešām ir laba ideja?
- kā ar tiem strādāt PHP?
- un visbeidzot, daži ieteikumi un izplatītas kļūdas, no kurām jāizvairās – slazds, uz kurām mēs nejauši uzdūrāmies reālajā pasaulē!
Mēs neapspriedīsim, kā iestatīt vides mainīgos jūsu tīmekļa serverī/Docker/crontabs... jo tas ir atkarīgs no sistēmas, programmatūra, un mēs vēlamies koncentrēties uz pašiem vides mainīgajiem.
Ja jūsu mitināšana izmanto Docker Swarm vai AWS, lietas būs nedaudz atšķirīgas, piemēram, jo viņi ir izvēlējušies ievietot failus jūsu konteinera failu sistēmā, lai ievadītu jūsu slepenās atslēgas, nevis izmantotu vides mainīgos. Tas ir ļoti specifisks šīm platformām, un tas nav izplatīts risinājums ikvienam.
Env vars 101
Kad programma darbojas, tā pārmanto visus vides mainīgos no saviem vecākiem. Tātad, ja iestatīsit YOLO mainīgo uz covfefe programmā bash un pēc tam palaidīsit komandu, jūs varēsit lasīt YOLO jebkurā pakārtotajā procesā.
$ YOLO=covfefe php -r "echo getenv("YOLO");" covfefe
Tā kā šis mainīgais ir definēts tikai lokāli, mēs nevaram to nolasīt no cita termināļa (cita vecāka). Ideja ir nodrošināt, lai jūsu lietojumprogramma vienmēr mantotu pareizos mainīgos.
Varat skatīt visus vides mainīgos komandrinda palaižot šo komandu, bet jūs neredzēsit YOLO mainīgo, jo tas tika nodots komandai php tikai lidojuma laikā un nav iestatīts pašreizējā procesā:
Vides mainīgo var iestatīt, izmantojot eksportēšanu<имя>=<значение> :
$ eksportēt YOLO=covfefe
Mainīgo nosaukumos ir reģistrjutīgi, un nosaukumi tiek lietoti tikai angļu valodā ar lielajiem burtiem, ar _ kā atdalītāju (tā sauktais "čūskas" stils ar lielajiem burtiem). Jūs droši vien jau zināt dažus mainīgos, piemēram, PATH, DISPLAY, HTTP_PROXY...
Šodienas labākā prakse
josegonzalez/dotenv, uz drošību orientēts:
Šī bibliotēka pēc noklusējuma neaizpildīs superglobālus:
$Loader = jauns josegonzalez\Dotenv\Loader("ceļš/uz/.env"); // Parsēt failu.env: $Loader->parse(); // Nosūtiet parsēšanas rezultātu.env mainīgajam $_ENV: $Loader->toEnv();
Tas atbalsta nepieciešamos mainīgos, filtrēšanu un var radīt izņēmumus, kad mainīgais tiek pārrakstīts.
symfony/dotenv, jauns bērns blokā:
Pieejams kopš Symfony 3.3. Šis komponents rūpējas par .env failu tāpat kā citi, kā arī aizpilda superglobālos masīvus:
$dotenv = jauns Symfony\Component\Dotenv\Dotenv(); $dotenv->load(__DIR__."/.env"); $dbUser = getenv("DB_USER"); $dbUser = $_ENV["DB_USER"]; $dbUser = $_SERVER["DB_LIETOTĀJS"];
Jums nevajadzētu to izmantot, lai iegūtu savas vērtības, tāpēc es iesaku izsaukt $_SERVER — turklāt pastāv neliela veiktspējas atšķirība starp masīva izsaukšanu un funkcijas izsaukšanu par labu masīviem.
Vides mainīgie vienmēr ir virknes
Viena no galvenajām problēmām ir tā, ka pašlaik PHP ir veidi, un mūsu iestatījumi ne vienmēr tiek ievadīti pareizi.
Db klase (publiskā funkcija connect(virknes saimniekdatora nosaukums, int ports) ( ) ) // Tas nedarbosies: $db->connect($_SERVER["DATABASE_HOSTNAME"], $_SERVER["DATABASE_PORT"]);
Programmā Symfony tagad varat konvertēt mainīgos un vēl vairāk - lasīt failu, dekodēt json...
Vides mainīgie visur vai ne
Pašlaik notiek daudz diskusiju par vides mainīgo, failu vai abu kombinācijas izmantošanu: vides mainīgais attiecas uz konfigurācijas failu. Lieta ir tāda, ka, lai gan tā tiek uzskatīta par labāko praksi, vides mainīgie nesniedz lielu labumu...
Bet, ja to lieto pareizi, piemēram, Symfony lietojumprogrammā, vides mainīgos var mainīt lidojuma laikā - netīrot kešatmiņu, nepiekļūstot failu sistēma, neizvietojot kodu: piemēram, vienkārši restartējiet procesu.
Tendence, ka ir tikai viens mainīgais, piemēram, APP_CONFIG_PATH, un tas tiek lasīts, izmantojot "%env(json:file:APP_CONFIG_PATH)%", man šķiet kā veco labo parametru.yml izgudrošana, ja vien failu automātiski nepārvalda uzticams rīks (piemēram, AWS Secret Store). ). Un ir arī envkey.com, kas ļauj pārvaldīt vides mainīgos vienuviet, pašam nekratoties ar failiem. Man patīk šī pieeja, jo tā ir daudz vienkāršāka!
Vides mainīgie
Vides mainīgie PHP
Tieši pirms skripta palaišanas serveris tam nodod dažus vides mainīgos ar informāciju. Daži mainīgie satur dažas galvenes, bet ne visas (jūs nevarat iegūt visas galvenes). Tālāk es sniegšu svarīgāko vides mainīgo sarakstu.
HTTP_ACCEPT
Šajā mainīgajā ir uzskaitīti visi MIME datu veidi, ko var interpretēt pārlūkprogramma. Līnija */* nozīmē, ka pārlūkprogramma saprot jebkuru veidu.
HTTP_ACCEPT= attēls/gif, attēls/x-xbitmap, attēls/jpeg, attēls/pjpeg, lietojumprogramma/x-shockwave-flash, lietojumprogramma/vnd.ms-excel, lietojumprogramma/msword, */*
HTTP_REFERER
Šis mainīgais apzīmē informāciju par lapu, no kuras lietotājs nokļuva šajā lapā. Varat izmantot šo mainīgo, piemēram, lai izsekotu lietotāja pārvietošanos jūsu vietnē un pēc tam skatītu populārākos maršrutus.
HTTP_REFERER= http://www.spravkaweb.ru/php/pril/
HTTP_COOKIE
Šis mainīgais saglabā visus URL kodētos sīkfailus.
HTTP_COOKIE= hotlog=1; ZDEDebuggerPresent=php,phtml,php3; b=b; PHPSESSID=16805922a9258cda274316e60f649cf8
HTTP_USER_AGENT
Identificē lietotāja pārlūkprogrammu. Lai noteiktu pārlūkprogrammas veidu, šajā rindā ir jāpārbauda vārdu klātbūtne: ja pārlūkprogramma ir Internet Explorer, tad būs MSIE apakšvirkne, un, ja ir tikai vārds Mozilla, tad tas ir Netscape.
Piemēram:
HTTP_USER_AGENT= Mozilla/4.0 (saderīgs; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)
HTTP_HOST
Satur tā tīmekļa servera domēna nosaukumu, kurā darbojās skripts. Šo mainīgo ir diezgan ērti izmantot, piemēram, lai ģenerētu pilnu ceļu, kas ir nepieciešams Location galvenē, lai nebūtu piesaistīts konkrētam serverim.
HTTP_HOST= www.spravkaweb.ru
HTTP_FROM
Tā lietotāja e-pasta adrese, kurš nosūtīja pieprasījumu.
SERVER_NAME
Domēna vārds vai servera IP adrese.
SERVER_NAME= www.spravkaweb.ru
SERVER_PROGRAMMATŪRA
Servera programmas nosaukums un versija, kas atbild uz klienta pieprasījumu.
SERVER_PORT
Šis mainīgais satur servera portu, kuram piekļuva lietotāja pārlūkprogramma. Parasti tas ir 80. Mainīgo var izmantot arī, lai izveidotu Location galvenes parametru.
SERVER_PROTOCOL
Mainīgais satur pieprasījumam izmantotā informācijas protokola nosaukumu un versiju.
SERVER_PROTOCOL = HTTP/1.1
REMOTE_ADDR
Šis mainīgais satur tā lietotāja resursdatora IP adresi (vai domēna nosaukumu), kurā tika palaists pārlūks.
REMOTE_PORT
Ports, kas ir piešķirts lietotāja pārlūkprogrammai, lai saņemtu servera atbildi.
REMOTE_USER
Pieprasījuma iesniedzēja lietotāja identifikācijas vārds.
SCRIPT_NAME
Satur tā faila nosaukumu, kurā ir šis skripts. Šis mainīgais ir ērti lietojams, veidojot galveni Atrašanās vieta, pāradresējot uz sevi (pašnovirzīšana), kā arī lai aizstātu taga darbības atribūta vērtību