Php miljövariabler. CGI-miljövariabler. Fältvariabler för HTTP-begäran

Detta är en kort instruktion för att implementera en PHP-tjänstkonfiguration som beror på miljön där den körs. Jag blir glad om någon föreslår en mer elegant lösning eller korrigerar i småsaker.

huvudtanken

Kör tjänsten, mikrotjänsterna och beroende applikationer inom samma ekosystem, konfigurerade med hjälp av miljövariabler.
Problem
Den här artikeln upprepar "miljövariabler" för många gånger.
Ur lådan ignorerar php-fpm globala miljövariabler (getenv-funktion), medan php cli kan ta emot dem.
Bakgrund
Du kan hoppa över det här avsnittet om du redan har arbetat med .env

Jag arbetar för närvarande med ett projekt skrivet i ZF2. För att konfigurera projektet användes konfigurationsfiler för olika miljöer. Detta genererar ett stort antal dubbletter av konfigurationer i projektförrådet, ungefär så här:
  • session.global.php
  • session.local.php.dist
  • session.unittest.php.dist
  • db.global.php
  • db.local.php.dist
  • db.unittest.php.dist
Dessa dubbletter måste ständigt synkroniseras med varandra. Dessutom lagrar de viss PHP-logik inom sig själva, vilket skapar kodduplicering.

Så projektet tar nu hänsyn till miljön, men...

Medan utvecklingen utfördes på fungerande maskiner läste projektet .env-filen och allt fungerade. Men när jag distribuerade en testmiljö visade det sig att om jag ställer in riktiga systemmiljövariabler så ignorerar php-fpm dem. Olika recept från Google och StackOverflow kokade ner till en eller annan automatisering av användningen av två välkända metoder:

1. Skicka variabler via nginx med fastcgi_param-parametern SOMEENV-testet;
2. Ställa in variabler i env-format i konfigurationen för php-fpm-arbetarprocesspoolen.

Både det första och det andra alternativet är praktiskt för vissa speciella situationer. Men om du tänker i paradigmet att "konfigurera miljön, inte applikationen", så visar sig sådana metoder vara mycket svårare än att till exempel bara lägga en .env-fil i projektmappen. Men en orkestrator, ett CI-system eller helt enkelt en systemadministratör bör inte känna till detaljerna i projektimplementeringen, detta är inte elegant.

Föreslagen lösning
Efter att ha kombinerat olika recept från Internet hittade jag följande fungerande lösning.
Testad under Centos 7, PHP 5.6.14.

1. Öppna /etc/php.ini - Ersätt variables_order = "GPCS" med variables_order = "EGPCS" # Efter detta kommer PHP att lägga till miljövariabler till det globala utrymmet # http://php.net/manual/ru/ini. core.php #ini.variables-order 2. Öppna /etc/php-fpm.d/www.conf, inte att förväxla med /etc/php-fpm.conf (kan finnas på olika ställen på olika system, detta är www-processpoolens konfiguration för php-fpm - Lägg till (eller ersätt om du har en): clear_env = nej # inaktivera rensning av globala variabler för lanserade arbetare 3. Ställ in nödvändiga miljövariabler i /etc/environment (standardsyntax A=B ) 4. ln -fs / etc/environment /etc/sysconfig/php-fpm # nu kommer tjänstemiljövariabeln php-fpm config att vara en länk till den globala config 5. systemctl daemon-reload && service php-fpm restart

Samma tillvägagångssätt med en symbollänk är i teorin tillämplig på andra tjänster.

Fördelar med den föreslagna lösningen:
- Variabler lagrade i /etc/environment är tillgängliga för olika applikationer. Du kan anropa echo $MYSQL_HOST i skal eller getenv("MYSQL_HOST") i php.
- Miljövariabler som inte är explicit inställda i /etc/environment kommer inte att hamna i php-fpm. Detta gör att orkestratorn kan styra miljön utanför det isolerade system där tjänsten körs.

Minus:
- Tyvärr hittade jag inget fungerande kommando för reload i php-fpm, liknande nginx, så om du ändrar /etc/environment måste du göra systemctl daemon-reload && service php-fpm omstart.

Viktig: Om din applikation inte körs i en isolerad miljö (server, virtuell maskin, behållare), kan definition av miljövariabler oförutsägbart påverka närliggande tjänster i systemet på grund av namnmatchningar i det globala utrymmet.

Uppmärksamhet! Artikeln skrevs under Windows 7, men det finns inga grundläggande skillnader i att lägga till PHP till miljövariabler i andra versioner (Windows XP, Windows Vista, Windows 8, ...).

Information! Alla sökvägar i inställningarna kommer att indikeras baserat på det faktum att Denwer är installerad i mappen D:/webb. När du använder data från artikeln, glöm inte att ändra denna sökväg till din egen.

För att använda PHP bekvämt i Windows-konsolen måste du ställa in miljövariabler. Annars, när du arbetar med PHP via konsolen, istället för php-kommandot, måste du skriva hela sökvägen till php.exe-filen.

Låt oss anta att Denwer är installerad i mappen D:/web.

Högerklicka på ikonen "Dator" Egenskaper:

Ytterligare systemparametrar:

Fliken "Avancerat", knappen "Miljöinställningar...":

Systeminställningar, markera sökvägsvariabeln och klicka på knappen Redigera:

Lägg till raden D:\web\usr\local\php5; och klicka på "Ok":

Starta om Denwer. Nu kan du öppna konsolen (Win + R och ange cmd) och kontrollera PHP-funktionen, ange kommandot:

För att åtgärda dessa fel, öppna filen D:/web/usr/local/php5/php.ini. Hitta variablerna extension_dir, zend_extension, session.save_path och ställ in dem på följande värden.

Omedelbart innan skriptet startas skickar servern några miljövariabler med information till det. Vissa variabler innehåller vissa rubriker, men inte alla (du kan inte få alla rubriker).

HTTP_ACCEPT- Denna variabel listar alla MIME-datatyper som kan accepteras av webbläsaren. Raden */* betyder att webbläsaren förstår vilken typ som helst.

HTTP_ACCEPT= */*

HTTP_REFERER- Den här variabeln representerar information om sidan från vilken användaren kom till den här. Du kan till exempel använda den här variabeln för att spåra en användares rörelser runt din webbplats och sedan visa de mest populära rutterna.

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

HTTP_COOKIE- Denna variabel lagrar alla URL-kodade cookies.

HTTP_COOKIE=

HTTP_USER_AGENT- Identifierar användarens webbläsare. För att fastställa webbläsartypen måste du kontrollera den här raden för förekomst av ord: om webbläsaren är Internet Explorer, kommer MSIE-delsträngen att finnas, och om bara ordet Mozilla finns, är detta Netscape.

HTTP_USER_AGENT= Mozilla/4.0 (kompatibel; MSIE 5.0; Windows NT 4.0)

Du har Internet Explorer

HTTP_HOST- Innehåller domännamnet för webbservern som skriptet kördes på. Denna variabel är ganska bekväm att använda, till exempel för att generera den fullständiga sökvägen, som krävs i Location headern för att inte vara knuten till en specifik server.

HTTP_HOST= www.spravkaweb.ru

HTTP_FROM- E-postadress till användaren som skickade begäran.

HTTP_FROM=

SERVER NAMN- Domännamn eller server-IP-adress.

SERVER_NAME= www.spravkaweb.ru

SERVER_SOFTWARE- Namnet och versionen av serverprogrammet som svarar på klientförfrågan.

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 PHP1bCGI/0.

SERVER PORT- Den här variabeln innehåller serverporten som användarens webbläsare fick åtkomst till. Vanligtvis är detta 80. Variabeln kan också användas för att bilda Location header-parametern.

SERVER_PORT= 80

SERVER_PROTOCOL- Variabeln innehåller namnet och versionen av informationsprotokollet som användes för begäran.

SERVER_PROTOCOL= HTTP/1.0

REMOTE_ADDR- Den här variabeln innehåller IP-adressen (eller domännamnet) för användarens värd där webbläsaren startades.

REMOTE_ADDR= 212.94.114.177

REMOTE_PORT- Porten som är tilldelad till användarens webbläsare för att ta emot serversvaret.

REMOTE_PORT= 4277

REMOTE_USER- Identifieringsnamnet på användaren som skickar begäran.

REMOTE_USER=

SCRIPT_NAME- Innehåller namnet på filen som innehåller detta skript. Den här variabeln är bekväm att använda när du skapar platshuvudet när du omdirigerar till dig själv (självomdirigering), samt för att ersätta värdet på taggens actionattribut

på sidan som skriptet anropar när det startas utan parametrar (för att inte vara knutet till ett specifikt skriptnamn).

SCRIPT_NAME=/pril.php

DOCUMENT_ROOT- Rotkatalogen för webbdokumentträdet.

DOCUMENT_ROOT=/home/spravka/public_html

REQUEST_METHOD- Metoden som användaren använder vid överföring av data. Det bör noteras att ett välskrivet skript själv bör avgöra, baserat på denna variabel, vilken metod användaren använder, och ta emot data från lämplig källa, och inte förvänta sig att överföringen kommer att utföras, till exempel, endast av POST-metoden.

REQUEST_METHOD= SKAFFA SIG

FRÅGESTRÄNG- Innehåller parametrar som visas efter frågetecknet i URL:en. Låt oss påminna dig om att de är tillgängliga både med GET- och POST-metoderna (om de i det senare fallet definierades i taggens action-attribut ).

QUERY_STRING= ss=getenv

PATH_INFO- Innehåller ytterligare information om vägen.

PATH_INFO=

PATH_ÖVERSÄTT- Samma information som i variabeln PATH_INFO med ett prefix som anger sökvägen till rotkatalogen för webbdokumentträdet.

PATH_TRANSLATED=

INNEHÅLLSTYP- Mediedatatyp för begäran.

CONTENT_TYPE=

CONTENT_LENGTH- Returnerar antalet byte med data som skickats av användaren. Denna variabel måste analyseras om du accepterar och bearbetar ett POST-formulär.

GATEWAY_INTERFACE- Den version av CGI som servern använder.

GATEWAY_INTERFACE= CGI/1.1


Miljövariabler

Miljövariabler:




echo "Du kom från: ".getenv("HTTP_REFERER")."
";
$br=getenv("HTTP_USER_AGENT");
if(strpos($br,"MSIE")!==false) echo "Du har Internet Explorer
";
else echo "Du har Netscape eller andra.
";
echo "Din IP: ".getenv("REMOTE_ADDR")."
";
echo "Här är parametrarna i webbläsarraden: ".getenv("QUERY_STRING");
?>

Miljövariabler

Miljövariabler i PHP

Omedelbart innan skriptet startas skickar servern några miljövariabler med information till det. Vissa variabler innehåller vissa rubriker, men inte alla (du kan inte få alla rubriker). Nedan kommer jag att ge en lista över de viktigaste miljövariablerna.

HTTP_ACCEPT

Denna variabel listar alla MIME-datatyper, som kan tolkas av webbläsaren. Raden */* betyder att webbläsaren förstår vilken typ som helst.

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

HTTP_REFERER

Denna variabel representerar information om sidan från vilken användaren kom till denna. Du kan till exempel använda den här variabeln för att spåra en användares rörelser runt din webbplats och sedan visa de mest populära rutterna.

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

HTTP_COOKIE

Denna variabel lagrar alla URL-kodade cookies.

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

HTTP_USER_AGENT

Identifierar användarens webbläsare. För att fastställa webbläsartypen måste du kontrollera den här raden för förekomst av ord: om webbläsaren är Internet Explorer, kommer MSIE-delsträngen att finnas, och om bara ordet Mozilla finns, är detta Netscape.

Till exempel:

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

HTTP_HOST

Innehåller domännamnet för webbservern som skriptet kördes på. Denna variabel är ganska bekväm att använda, till exempel för att generera den fullständiga sökvägen, som krävs i Location headern för att inte vara knuten till en specifik server.

HTTP_HOST= www.spravkaweb.ru

HTTP_FROM

E-postadressen till användaren som skickade begäran.

SERVER NAMN

Domännamn eller server-IP-adress.

SERVER_NAME= www.spravkaweb.ru

SERVER_SOFTWARE

Namnet och versionen av serverprogrammet som svarar på klientförfrågan.

SERVER PORT

Denna variabel innehåller serverporten som användarens webbläsare fick åtkomst till. Vanligtvis är detta 80. Variabeln kan också användas för att bilda Location header-parametern.

SERVER_PROTOCOL

Variabeln innehåller namnet och versionen av informationsprotokollet som användes för begäran.

SERVER_PROTOCOL= HTTP/1.1

REMOTE_ADDR

Denna variabel innehåller IP-adressen (eller domännamnet) för användarens värd där webbläsaren startades.

REMOTE_PORT

Porten som är tilldelad till användarens webbläsare för att ta emot serversvaret.

REMOTE_USER

Identifieringsnamnet på användaren som gör begäran.

SCRIPT_NAME

Innehåller namnet på filen som innehåller detta skript. Den här variabeln är bekväm att använda när du skapar platshuvudet när du omdirigerar till dig själv (självomdirigering), samt för att ersätta värdet på taggens actionattribut på sidan som skriptet anropar när det startas utan parametrar (för att inte vara knutet till ett specifikt skriptnamn).

DOCUMENT_ROOT

Rotkatalogen för webbdokumentträdet.

REQUEST_METHOD

Metoden som användaren använder vid överföring av data. Det bör noteras att ett välskrivet skript själv bör bestämma, baserat på denna variabel, vilken metod användaren använder, och ta emot data från lämplig källa, och inte förvänta sig att överföringen kommer att utföras, till exempel endast av POST-metoden.

FRÅGESTRÄNG

Innehåller parametrarna som visas efter frågetecknet i URL:en. Låt oss påminna dig om att de är tillgängliga både med GET- och POST-metoderna (om de i det senare fallet definierades i taggens action-attribut ).

PATH_INFO

Innehåller ytterligare information om sökvägen.

PATH_ÖVERSÄTT

Samma information som i variabeln PATH_INFO med ett prefix som anger sökvägen till rotkatalogen i webbdokumentträdet.

INNEHÅLLSTYP

Mediedatatyp för begäran.

CONTENT_LENGTH

Returnerar antalet byte med data som skickats av användaren. Denna variabel måste analyseras om du accepterar och bearbetar ett POST-formulär.

GATEWAY_INTERFACE

CGI-versionen som servern använder.

Exempel på användning av miljövariabler

Miljövariabler

Miljövariabler:

echo "Du kom från: ".getenv("HTTP_REFERER")."
";

$br=getenv("HTTP_USER_AGENT");

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

else echo "Du har Netscape eller andra.
";

echo "Din IP: ".getenv("REMOTE_ADDR")."
";

echo "Här är parametrarna i webbläsarraden: ".getenv("QUERY_STRING");

Från boken Konsten att programmera för Unix författare Raymond Eric Stephen

Från boken Konsten att programmera för Unix författare Raymond Eric Stephen

Från boken Programmering i Ruby [Språkideologi, teori och tillämpningspraktik] av Fulton Hal

Från boken HTML 5, CSS 3 och Web 2.0. Utveckling av moderna webbsidor. författare Dronov Vladimir

Från boken Application Development in the Linux Environment. Andra upplagan författare Johnson Michael K.

10.4. Miljövariabler När ett Unix-program körs innehåller miljön som är tillgänglig för det en uppsättning namn-värde-relationer (både namn och värden är strängar). Vissa av dem installeras manuellt av användaren, andra installeras av systemet under

Från boken Firebird DATABAS UTVECKLARGUIDE av Borri Helen

10.4.1. Systemmiljövariabler Det finns många välkända miljövariabler som ett program kan få när det körs från ett Unix-skal. Dessa variabler (särskilt HOME) behöver ofta utvärderas innan man läser den lokala filen

Från boken Linux-programmering med exempel författare Robbins Arnold

10.4.2. Anpassade miljövariabler Även om applikationer är fria att tolka miljövariabler utanför den systemdefinierade uppsättningen, är faktisk användning av en sådan funktion för närvarande ganska ovanlig.

Från författarens bok

10.4.3. När ska man använda miljövariabler Vad både användar- och systemmiljövariabler har gemensamt är att de innehåller data som skulle vara tråkiga att lagra i ett stort antal konfigurationsfiler. Och extremt tröttsamt

Från författarens bok

14.4. Miljövariabler Ibland är det nödvändigt att komma åt miljövariabler, som är länken mellan programmet och omvärlden. Miljövariabler är helt enkelt etiketter associerade med viss text (vanligtvis liten); de lagrar till exempel stigar till

Från författarens bok

Funktioner och variabler. Lokala variabler Tidigare deklarerade funktioner skapar sina egna variabler i kroppen. Dessa är så kallade lokala variabler. Sådana variabler är endast tillgängliga inom funktionskroppen där de deklareras. När exekveringen är klar

Från författarens bok

22.3.3. Miljövariabler I program som använder setuid- eller setgid-funktioner måste särskild försiktighet iakttas med miljöinställningar. Dessa variabler bestäms av användaren som aktiverade programmet, vilket öppnar dörren för attacker. Den mest uppenbara attacken

Från författarens bok

Miljövariabler Miljövariabler är globala systeminställningar som används när operativsystemet startar. På Windows, Linux och de flesta UNIX-system känner Firebird-servern igen och använder vissa miljövariabler om de

Från författarens bok

Var Windows-miljövariabler ställs in Typen av miljövariabler och hur de ställs in varierar från en version av Windows till en annan. I tabell Tabell 3.1 visar typerna (om tillämpligt) och metoderna för att ställa in värdena för miljövariabler Tabell 3.1. Miljövariabelinställningar för

Från författarens bok

Kapitel 2 Argument, alternativ och miljövariabler Den första uppgiften för alla program är vanligtvis att tolka kommandoradsalternativ och argument. Det här kapitlet undersöker hur C (och C++)-program tar emot sina kommandoradsargument, som beskriver standard

Miljövariabler

Miljövariabler i PHP

Omedelbart innan skriptet startas skickar servern några miljövariabler med information till det. Vissa variabler innehåller vissa rubriker, men inte alla (du kan inte få alla rubriker). Nedan kommer jag att ge en lista över de viktigaste miljövariablerna.

HTTP_ACCEPT

Denna variabel listar alla MIME-datatyper, som kan tolkas av webbläsaren. Raden */* betyder att webbläsaren förstår vilken typ som helst.

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

HTTP_REFERER

Denna variabel representerar information om sidan från vilken användaren kom till denna. Du kan till exempel använda den här variabeln för att spåra en användares rörelser runt din webbplats och sedan visa de mest populära rutterna.

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

HTTP_COOKIE

Denna variabel lagrar alla URL-kodade cookies.

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

HTTP_USER_AGENT

Identifierar användarens webbläsare. För att fastställa webbläsartypen måste du kontrollera den här raden för förekomst av ord: om webbläsaren är Internet Explorer, kommer MSIE-delsträngen att finnas, och om bara ordet Mozilla finns, är detta Netscape.

Till exempel:

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

HTTP_HOST

Innehåller domännamnet för webbservern som skriptet kördes på. Denna variabel är ganska bekväm att använda, till exempel för att generera den fullständiga sökvägen, som krävs i Location headern för att inte vara knuten till en specifik server.

HTTP_HOST= www.spravkaweb.ru

HTTP_FROM

E-postadressen till användaren som skickade begäran.

SERVER NAMN

Domännamn eller server-IP-adress.

SERVER_NAME= www.spravkaweb.ru

SERVER_SOFTWARE

Namnet och versionen av serverprogrammet som svarar på klientförfrågan.

SERVER PORT

Denna variabel innehåller serverporten som användarens webbläsare fick åtkomst till. Vanligtvis är detta 80. Variabeln kan också användas för att bilda Location header-parametern.

SERVER_PROTOCOL

Variabeln innehåller namnet och versionen av informationsprotokollet som användes för begäran.

SERVER_PROTOCOL= HTTP/1.1

REMOTE_ADDR

Denna variabel innehåller IP-adressen (eller domännamnet) för användarens värd där webbläsaren startades.

REMOTE_PORT

Porten som är tilldelad till användarens webbläsare för att ta emot serversvaret.

REMOTE_USER

Identifieringsnamnet på användaren som gör begäran.

SCRIPT_NAME

Innehåller namnet på filen som innehåller detta skript. Den här variabeln är bekväm att använda när du skapar platshuvudet när du omdirigerar till dig själv (självomdirigering), samt för att ersätta värdet på taggens actionattribut på sidan som skriptet anropar när det startas utan parametrar (för att inte vara knutet till ett specifikt skriptnamn).

DOCUMENT_ROOT

Rotkatalogen för webbdokumentträdet.

REQUEST_METHOD

Metoden som användaren använder vid överföring av data. Det bör noteras att ett välskrivet skript själv bör bestämma, baserat på denna variabel, vilken metod användaren använder, och ta emot data från lämplig källa, och inte förvänta sig att överföringen kommer att utföras, till exempel endast av POST-metoden.

FRÅGESTRÄNG

Innehåller parametrarna som visas efter frågetecknet i URL:en. Låt oss påminna dig om att de är tillgängliga både med GET- och POST-metoderna (om de i det senare fallet definierades i taggens action-attribut ).

PATH_INFO

Innehåller ytterligare information om sökvägen.

PATH_ÖVERSÄTT

Samma information som i variabeln PATH_INFO med ett prefix som anger sökvägen till rotkatalogen i webbdokumentträdet.

INNEHÅLLSTYP

Mediedatatyp för begäran.

CONTENT_LENGTH

Returnerar antalet byte med data som skickats av användaren. Denna variabel måste analyseras om du accepterar och bearbetar ett POST-formulär.

GATEWAY_INTERFACE

CGI-versionen som servern använder.

Exempel på användning av miljövariabler