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
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