PHP varijable okruženja. CGI varijable okruženja

10.08.2022

Varijable okruženja

Varijable okruženja u PHP-u

Neposredno prije pokretanja skripte, server mu prosljeđuje neke varijable okruženja s informacijama. Određene varijable sadrže neka zaglavlja, ali ne sva (ne možete dobiti sva zaglavlja). U nastavku ću dati listu najvažnijih varijabli okruženja.

HTTP_ACCEPT

Ova varijabla navodi sve MIME tipovi podataka, što se može interpretirati od strane pretraživača. Linija */* znači da pretraživač razumije bilo koju vrstu.

HTTP_ACCEPT= image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*

HTTP_REFERER

Ova varijabla predstavlja informaciju o stranici sa koje je korisnik došao na ovu. Ovu varijablu možete koristiti, na primjer, da pratite kretanje korisnika po vašoj web-lokaciji, a zatim pregledate najpopularnije rute.

HTTP_REFERER= http://www.spravkaweb.ru/php/pril/

HTTP_COOKIE

Ova varijabla pohranjuje sve URL kodirane kolačiće.

HTTP_COOKIE= hotlog=1; ZDEDebuggerPresent=php,phtml,php3; b=b; PHPSESSID=16805922a9258cda274316e60f649cf8

HTTP_USER_AGENT

Identificira korisnikov pretraživač. Da biste ustanovili tip pretraživača, morate provjeriti u ovom redu riječi: ako je pretraživač - Internet Explorer, tada će biti prisutan MSIE podniz, a ako je prisutna samo riječ Mozilla, onda je ovo Netscape.

na primjer:

HTTP_USER_AGENT= Mozilla/4.0 (kompatibilan; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)

HTTP_HOST

Sadrži ime domene web servera na kojem je skripta pokrenuta. Ova varijabla je prilično zgodna za korištenje, na primjer, za generiranje pune putanje, koja je potrebna u zaglavlju lokacije kako ne bi bila vezana za određeni server.

HTTP_HOST= www.spravkaweb.ru

HTTP_FROM

Adresa email korisnika koji je poslao zahtjev.

SERVER_NAME

Ime domene ili IP adresa servera.

SERVER_NAME= www.spravkaweb.ru

SERVER_SOFTWARE

Ime i verzija serverskog programa koji odgovara na zahtjev klijenta.

SERVER_PORT

Ova varijabla sadrži port servera kojem je pristupio korisnikov pretraživač. Obično je to 80. Varijabla se također može koristiti za formiranje parametra zaglavlja lokacije.

SERVER_PROTOCOL

Varijabla sadrži ime i verziju informacijskog protokola koji je korišten za zahtjev.

SERVER_PROTOCOL= HTTP/1.1

REMOTE_ADDR

Ova varijabla sadrži IP adresu (ili ime domene) hosta korisnika na kojem je pretraživač pokrenut.

REMOTE_PORT

Port koji je dodijeljen korisnikovom pretraživaču za primanje odgovora servera.

REMOTE_USER

Identifikaciono ime korisnika koji podnosi zahtev.

SCRIPT_NAME

Sadrži naziv datoteke koja sadrži ovu skriptu. Ova varijabla je zgodna za korištenje prilikom formiranja zaglavlja lokacije prilikom preusmjeravanja na sebe (self-redirect), kao i za zamjenu vrijednosti atributa akcije oznake

na stranici koju skripta poziva kada se pokrene bez parametara (kako ne bi bila vezana za određeno ime skripte).

DOCUMENT_ROOT

Korijenski direktorij stabla web dokumenata.

REQUEST_METHOD

Metoda koju korisnik koristi prilikom prijenosa podataka. Treba napomenuti da dobro napisana skripta sama treba da odredi, na osnovu ove varijable, koju metodu korisnik koristi, i da prima podatke iz odgovarajućeg izvora, a ne da očekuje da će prenos biti izvršen, npr. metodom POST.

QUERY_STRING

Sadrži parametre koji se pojavljuju nakon upitnika u URL-u. Podsjetimo da su dostupni i sa metodama GET i POST (ako su u drugom slučaju definirani u atributu akcije oznake ).

PATH_INFO

Sadrži dodatne informacije o stazi.

PATH_TRANSLATED

Ista informacija kao u varijabli PATH_INFO s prefiksom koji specificira putanju do korijenskog direktorija stabla web dokumenata.

CONTENT_TYPE

Vrsta medijskih podataka zahtjeva.

CONTENT_LENGTH

Vraća broj bajtova podataka koje je korisnik poslao. Ovu varijablu treba analizirati ako prihvatate i obrađujete POST obrazac.

GATEWAY_INTERFACE

CGI verzija koju server koristi.

Primjer korištenja varijabli okruženja

Varijable okruženja

Varijable okruženja:

echo "Došli ste iz: ".getenv("HTTP_REFERER")."
";

$br=getenv("HTTP_USER_AGENT");

if(strpos($br,"MSIE")!==false) echo "Imate Internet Explorer
";

else echo "Imate Netscape ili druge.
";

echo "Vaša IP adresa: ".getenv("REMOTE_ADDR")."
";

echo "Ovo su parametri u liniji pretraživača: ".getenv("QUERY_STRING");

Iz knjige Umetnost programiranja za Unix autor Raymond Eric Stephen

Iz knjige Umetnost programiranja za Unix autor Raymond Eric Stephen

Iz knjige Programiranje u Rubyju [Jezična ideologija, teorija i praksa primjene] od Fulton Hala

Iz knjige HTML 5, CSS 3 i Web 2.0. Izrada modernih web stranica. autor Dronov Vladimir

Iz knjige Razvoj aplikacija u Linux okruženje. Drugo izdanje autor Džonson Majkl K.

10.4. Varijable okruženja Kada se Unix program pokrene, okruženje koje mu je dostupno uključuje skup odnosa ime-vrijednost (i imena i vrijednosti su nizovi). Neke od njih korisnik instalira ručno, druge instalira sistem tokom

Iz knjige Firebird DATABASE DEVELOPER'S GUIDE od Borri Helen

10.4.1. Varijable sistemskog okruženja Postoje mnoge dobro poznate varijable okruženja koje program može dobiti kada se pokrene iz Unix ljuske. Ove varijable (posebno HOME) često treba procijeniti prije čitanja lokalne datoteke

Iz knjige Linux programiranje u primjerima autor Robbins Arnold

10.4.2. Prilagođene varijable okruženja Iako aplikacije mogu slobodno tumačiti varijable okruženja izvan sistemski definiranog skupa, stvarna upotreba takve funkcije je trenutno prilično neobična.

Iz autorove knjige

10.4.3. Kada koristiti varijable okruženja Varijablama korisničkog i sistemskog okruženja zajednička je činjenica da sadrže podatke koji su pohranjeni u velikim količinama konfiguracijske datoteke bilo bi zamorno. I izuzetno naporan

Iz autorove knjige

14.4. Varijable okruženja Ponekad je potrebno pristupiti varijablama okruženja, koje su veza između programa i vanjski svijet. Varijable okruženja su jednostavno oznake povezane s nekim tekstom (obično malim); pohranjuju, na primjer, staze do

Iz autorove knjige

Funkcije i varijable. Lokalne varijable Prethodno deklarirane funkcije kreiraju vlastite varijable unutar svog tijela. To su takozvane lokalne varijable. Takve varijable su dostupne samo unutar tijela funkcije u kojem su deklarirane. Kada se izvršenje završi

Iz autorove knjige

22.3.3. Varijable okruženja U programima koji koriste setuid ili setgid mogućnosti, posebna pažnja se mora obratiti na postavke okruženja. Ove varijable određuje korisnik koji je aktivirao program, čime se otvaraju vrata za napade. Najočigledniji napad

Iz autorove knjige

Varijable okruženja Varijable okruženja su globalne sistemske postavke koje se koriste tokom početnog pokretanja. operativni sistem. Na Windows, Linux i većini UNIX sistemi Firebird server prepoznaje i koristi neke varijable okruženja ako one

Iz autorove knjige

Gdje se postavljaju varijable Windows okruženja. Tip varijabli okruženja i način na koji se postavljaju razlikuju se od jedne? Windows verzije drugome. U tabeli Tabela 3.1 prikazuje tipove (ako je primjenjivo) i metode postavljanja vrijednosti varijabli okruženja. Postavke varijabli okruženja za

Iz autorove knjige

Poglavlje 2 Argumenti, opcije i varijable okruženja Prvi zadatak bilo kog programa je obično tumačenje opcija i argumenata komandne linije. Ovo poglavlje ispituje kako C (i C++) programi primaju svoje argumente komandne linije, opisujući standardne

Ovo je kratka uputstva za implementaciju konfiguracije PHP servisa, u zavisnosti od okruženja u kojem se izvodi. Biće mi drago ako neko predloži elegantnije rešenje ili ispravi u malim stvarima.

glavna ideja

Pokrenite uslugu, mikroservise i zavisne aplikacije unutar istog ekosistema, konfigurisanog pomoću varijabli okruženja.
Problem
Ovaj članak ponavlja "varijable okruženja" previše puta.
Izvan kutije, php-fpm ignoriše globalne varijable okruženja (getenv funkcija), dok ih php cli može primiti.
Pozadina
Možete preskočiti ovaj odjeljak ako ste već radili sa .env

IN trenutno Radim na projektu napisanom u ZF2. Za konfiguraciju projekta korištene su konfiguracijske datoteke za različita okruženja. Ovo stvara veliki broj duple konfiguracije u spremištu projekta otprilike ovako:
  • session.global.php
  • session.local.php.dist
  • session.unittest.php.dist
  • db.global.php
  • db.local.php.dist
  • db.unittest.php.dist
Ovi duplikati moraju biti stalno međusobno sinkronizirani. Osim toga, oni pohranjuju određenu PHP logiku u sebi, što stvara dupliciranje koda.

Dakle, projekat sada uzima u obzir životnu sredinu, ali...

Dok se razvoj odvijao na radnim mašinama, projekat je pročitao .env fajl i sve je funkcionisalo. Ali kada sam postavio probno okruženje, pokazalo se da ako postavim varijable stvarnog sistemskog okruženja, php-fpm ih ignoriše. Razni recepti iz Google-a i StackOverflow-a svodili su se na jednu ili drugu automatizaciju korištenja dvije dobro poznate metode:

1. Prenošenje varijabli preko nginx-a pomoću testa fastcgi_param parametra SOMEENV;
2. Postavljanje varijabli u env formatu u konfiguraciji spremišta php-fpm radnih procesa.

I prva i druga opcija pogodne su za neke posebne situacije. Ali ako razmišljate u paradigmi "konfiguracije okruženja, a ne aplikacije", onda se takve metode ispostavljaju mnogo težim od, na primjer, jednostavnog stavljanja .env datoteke u mapu projekta. Ali orkestrator, CI sistem, ili samo sistem administrator ne treba znati detalje realizacije projekta, nije elegantan.

Predloženo rješenje
Kombinirajući razne recepte sa interneta, pronašao sam sljedeće radno rješenje.
Testirano pod Centos 7, PHP 5.6.14.

1. Otvorite /etc/php.ini - Zamijenite varijabli_order = "GPCS" sa varijabli_order = "EGPCS" # Nakon ovoga, PHP će dodati varijable okruženja u globalni prostor # http://php.net/manual/ru/ini. core.php #ini.variables-order 2. Otvorite /etc/php-fpm.d/www.conf, ne treba se brkati sa /etc/php-fpm.conf (u različiti sistemi može biti na različitim mjestima, ovo je konfiguracija www procesnog bazena za php-fpm. - Dodajte (ili zamijenite, ako postoji): clear_env = no # onemogući brisanje globalnih varijabli za pokrenute radnike 3. Postavite potrebne varijable okruženja u /etc/environment (standardna sintaksa A=B) 4. ln -fs /etc/environment / etc/sysconfig/php-fpm # sada će konfiguracija varijable php-fpm servisnog okruženja jednostavno biti veza sa globalnom konfiguracijom 5. systemctl daemon-reload && service php-fpm restart

Isti pristup sa simboličkom vezom, u teoriji, primjenjiv je i na druge usluge.

Prednosti predloženog rješenja:
- Varijable pohranjene u /etc/environment su dostupne različitim aplikacijama. Možete pozvati echo $MYSQL_HOST u ljusci ili getenv("MYSQL_HOST") u php-u.
- Promenljive okruženja koje nisu eksplicitno postavljene u /etc/environment neće završiti u php-fpm. Ovo omogućava orkestratoru da kontroliše okruženje izvan izolovanog sistema u kojem se servis izvodi.

Protiv:
- Nažalost, nisam pronašao radnu naredbu za ponovno učitavanje u php-fpm-u, sličnu nginx-u, tako da ako promijenite /etc/environment, morate učiniti systemctl daemon-reload && service php-fpm restart.

Važno: Ako vaša aplikacija ne radi u izolovanom okruženju (server, virtuelna mašina, kontejner), definisanje varijabli okruženja može nepredvidivo uticati na susedne usluge u sistemu zbog podudaranja imena u globalnom prostoru.

Varijable okruženja koje se koriste u konfiguraciji danas su glavni način postavljanja postavki u aplikaciji kao što su vjerodajnice baze podataka, API ključevi, tajni ključevi i sve ostalo. razlikuje se ovisno o tome gdje je aplikacija raspoređena. Sada takve postavke ulaze u kod kroz okruženje, umjesto da budu direktno zapisane u konfiguracijskim datotekama ili, još gore, tvrdo kodirane direktno u kodu.

Pogledajmo izbliza:

  • Kako ovo funkcionira?
  • da li je ovo zaista dobra ideja?
  • kako raditi s njima u PHP-u?
  • i na kraju, neke preporuke i uobičajene greške koje treba izbjegavati – zamke na koje smo naišli u stvarnom svijetu!

Nećemo pokrivati ​​kako postaviti varijable okruženja na vašem web serveru/Dockeru/crontabs... jer to ovisi o sistemu, softver, i želimo se fokusirati na same varijable okruženja.

Ako vaš hosting koristi Docker Swarm ili AWS, stvari će biti malo drugačije, na primjer, jer su odabrali da ubace datoteke u sistem datoteka vašeg kontejnera kako bi ubacili vaše tajne ključeve umjesto da koriste varijable okruženja. Ovo je vrlo specifično za ove platforme i nije uobičajena opcija za sve.

Env vars 101

Kada se program pokrene, on nasljeđuje sve varijable okruženja od svojih roditelja. Dakle, ako postavite YOLO varijablu na covfefe u bash-u, a zatim pokrenete naredbu, moći ćete čitati YOLO u bilo kojem podređenom procesu.

$ YOLO=covfefe php -r "echo getenv("YOLO");" covfefe

Pošto je ova varijabla definirana samo lokalno, ne možemo je čitati s drugog terminala (drugog roditelja). Ideja je osigurati da vaša aplikacija uvijek nasljeđuje prave varijable.

Možete vidjeti sve varijable okruženja u komandna linija pokretanjem sljedeće komande, ali nećete vidjeti varijablu YOLO jer je proslijeđena php komandi samo u hodu i nije postavljena u trenutnom procesu:

Možete postaviti varijablu okruženja koristeći izvoz<имя>=<значение> :

$ export YOLO=covfefe

Imena varijabli razlikuju velika i mala slova i konvencija je da se imena koriste samo na engleskom jeziku, velikim slovima, sa _ kao separatorom (tzv. "zmijski" stil velikim slovima). Verovatno već znate neke varijable - kao što su PATH , DISPLAY , HTTP_PROXY ...

Najbolje prakse danas

josegonzalez/dotenv , sigurnosno orijentisan:

Ova biblioteka prema zadanim postavkama neće popunjavati superglobale:

$Loader = novi josegonzalez\Dotenv\Loader("path/to/.env"); // Parsiraj file.env: $Loader->parse(); // Šalje raščlanjivanje result.env u varijablu $_ENV: $Loader->toEnv();

Podržava potrebne varijable, filtriranje i može izbaciti izuzetke kada se varijabla prepiše.

symfony/dotenv , novi klinac u bloku:

Dostupno od Symfony 3.3. Ova komponenta brine o .env fajlu kao i ostale, a takođe ispunjava superglobalne nizove:

$dotenv = novi Symfony\Component\Dotenv\Dotenv(); $dotenv->load(__DIR__."/.env"); $dbUser = getenv("DB_USER"); $dbUser = $_ENV["DB_USER"]; $dbUser = $_SERVER["DB_USER"];

Ne biste ga trebali koristiti da dobijete svoje vrijednosti, pa predlažem da umjesto toga pozovete $_SERVER - plus postoji mala razlika u performansama između pozivanja niza i pozivanja funkcije u korist nizova.

Varijable okruženja su uvijek nizovi

Jedan od glavnih problema je taj što PHP trenutno ima tipove, a naša podešavanja nisu uvek ispravno otkucana.

Class Db ( public function connect(string hostname, int port) ( ) ) // Ovo neće raditi: $db->connect($_SERVER["DATABASE_HOSTNAME"], $_SERVER["DATABASE_PORT"]);

U Symfony-ju sada možete konvertovati varijable, pa čak i više - čitati fajl, dekodirati json...

Varijable okruženja svuda ili ne

Trenutno postoji mnogo debata između korištenja varijabli okruženja, datoteka ili mješavine oboje: varijabla okruženja se odnosi na konfiguracijski fajl. Stvar je u tome što, iako se to smatra najboljom praksom, varijable okruženja ne nude mnogo koristi...

Ali ako se pravilno koristi, u Symfony aplikaciji, na primjer, varijable okruženja mogu se mijenjati u hodu - bez brisanja predmemorije, bez pristupa sistem datoteka, bez postavljanja koda: samo ponovno pokretanje procesa, na primjer.

Trend da imam samo jednu varijablu kao što je APP_CONFIG_PATH i da je čitam preko "%env(json:file:APP_CONFIG_PATH)%" meni izgleda kao ponovno izmišljanje dobrih starih parameters.yml osim ako se fajlom automatski ne upravlja pouzdanim alatom (kao što je AWS Secret Store ). A tu je i envkey.com koji vam omogućava da upravljate varijablama okruženja na jednom mjestu bez da se sami petljate s datotekama, sviđa mi se ovaj pristup jer je mnogo lakši!

Varijable okruženja

Varijable okruženja u PHP-u

Neposredno prije pokretanja skripte, server mu prosljeđuje neke varijable okruženja s informacijama. Određene varijable sadrže neka zaglavlja, ali ne sva (ne možete dobiti sva zaglavlja). U nastavku ću dati listu najvažnijih varijabli okruženja.

HTTP_ACCEPT

Ova varijabla navodi sve MIME tipovi podataka, što se može interpretirati od strane pretraživača. Linija */* znači da pretraživač razumije bilo koju vrstu.

HTTP_ACCEPT= image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, */*

HTTP_REFERER

Ova varijabla predstavlja informaciju o stranici sa koje je korisnik došao na ovu. Ovu varijablu možete koristiti, na primjer, da pratite kretanje korisnika po vašoj web-lokaciji, a zatim pregledate najpopularnije rute.

HTTP_REFERER= http://www.spravkaweb.ru/php/pril/

HTTP_COOKIE

Ova varijabla pohranjuje sve URL kodirane kolačiće.

HTTP_COOKIE= hotlog=1; ZDEDebuggerPresent=php,phtml,php3; b=b; PHPSESSID=16805922a9258cda274316e60f649cf8

HTTP_USER_AGENT

Identificira korisnikov pretraživač. Da biste ustanovili tip pretraživača, morate provjeriti prisustvo riječi u ovoj liniji: ako je pretraživač Internet Explorer, tada će biti prisutan MSIE podniz, a ako je prisutna samo riječ Mozilla, onda je ovo Netscape.

na primjer:

HTTP_USER_AGENT= Mozilla/4.0 (kompatibilan; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; Maxthon)

HTTP_HOST

Sadrži ime domene web servera na kojem je skripta pokrenuta. Ova varijabla je prilično zgodna za korištenje, na primjer, za generiranje pune putanje, koja je potrebna u zaglavlju lokacije kako ne bi bila vezana za određeni server.

HTTP_HOST= www.spravkaweb.ru

HTTP_FROM

Email adresa korisnika koji je poslao zahtjev.

SERVER_NAME

Ime domene ili IP adresa servera.

SERVER_NAME= www.spravkaweb.ru

SERVER_SOFTWARE

Ime i verzija serverskog programa koji odgovara na zahtjev klijenta.

SERVER_PORT

Ova varijabla sadrži port servera kojem je pristupio korisnikov pretraživač. Obično je to 80. Varijabla se također može koristiti za formiranje parametra zaglavlja lokacije.

SERVER_PROTOCOL

Varijabla sadrži ime i verziju informacijskog protokola koji je korišten za zahtjev.

SERVER_PROTOCOL= HTTP/1.1

REMOTE_ADDR

Ova varijabla sadrži IP adresu (ili ime domene) hosta korisnika na kojem je pretraživač pokrenut.

REMOTE_PORT

Port koji je dodijeljen korisnikovom pretraživaču za primanje odgovora servera.

REMOTE_USER

Identifikaciono ime korisnika koji podnosi zahtev.

SCRIPT_NAME

Sadrži naziv datoteke koja sadrži ovu skriptu. Ova varijabla je zgodna za korištenje prilikom formiranja zaglavlja lokacije prilikom preusmjeravanja na sebe (self-redirect), kao i za zamjenu vrijednosti atributa akcije oznake na stranici koju skripta poziva kada se pokrene bez parametara (kako ne bi bila vezana za određeno ime skripte).

DOCUMENT_ROOT

Korijenski direktorij stabla web dokumenata.

REQUEST_METHOD

Metoda koju korisnik koristi prilikom prijenosa podataka. Treba napomenuti da dobro napisana skripta sama treba da odredi, na osnovu ove varijable, koju metodu korisnik koristi, i da prima podatke iz odgovarajućeg izvora, a ne da očekuje da će prenos biti izvršen, npr. metodom POST.

QUERY_STRING

Sadrži parametre koji se pojavljuju nakon upitnika u URL-u. Podsjetimo da su dostupni i sa metodama GET i POST (ako su u drugom slučaju definirani u atributu akcije oznake ).

PATH_INFO

Sadrži dodatne informacije o putanji.

PATH_TRANSLATED

Ista informacija kao u varijabli PATH_INFO s prefiksom koji specificira putanju do korijenskog direktorija stabla web dokumenata.

CONTENT_TYPE

Vrsta medijskih podataka zahtjeva.

CONTENT_LENGTH

Vraća broj bajtova podataka koje je korisnik poslao. Ovu varijablu treba analizirati ako prihvatate i obrađujete POST obrazac.

GATEWAY_INTERFACE

CGI verzija koju server koristi.

Primjer korištenja varijabli okruženja

Pažnja!Članak je napisan pod Windowsom 7, ali nema fundamentalnih razlika u dodavanju PHP-a varijablama okruženja u drugim verzijama (Window XP, Windows Vista, Windows 8,...).

Informacije! Sve staze u postavkama će biti naznačene na osnovu činjenice da je Denwer instaliran u folderu D:/web. Kada koristite podatke iz članka, ne zaboravite promijeniti ovu putanju na svoju.

Za zgodno koristeći PHP Morate da konfigurišete varijable okruženja u Windows konzoli. U suprotnom, kada radite sa PHP-om preko konzole, umesto komande php, moraćete da upišete punu putanju do php.exe datoteke.

Pretpostavimo da je Denwer instaliran u folderu D:/web.

Kliknite desnim tasterom miša na ikonu "Računar" Svojstva:

Dodatni sistemski parametri:

Kartica "Napredno", dugme "Postavke okruženja...":

Grupu System Settings, označite varijablu Putanja i kliknite na dugme Uredi:

Dodajte red D:\web\usr\local\php5; i kliknite "U redu":

Ponovo pokrenite Denwer. Sada možete otvoriti konzolu (Win + R i unesite cmd) i provjerite rad PHP-a, unesite naredbu:

Da biste ispravili ove greške, otvorite datoteku D:/web/usr/local/php5/php.ini. Pronađite varijable extension_dir, zend_extension, session.save_path i postavite ih na sljedeće vrijednosti.