2011-12-18 8 views
8

Co to jest odpowiednik setenv w środowisku apache? Dzięki apache mogę na przykład ustawić env "SOMEENV" i uzyskać do niego dostęp w php przez $ _ENV ['SOMEENV'] - ale nie mam pojęcia jak to zrobić z nginx + php-fpm.

Początkowo pomyślałem, że muszę ustawić ENV [SOMENEV] = test w konfiguracji mojej puli php-fpm, ale var_dump ($ _ ENV) wciąż nie zwraca nic.

Jakieś wskazówki?

Odpowiedz

17

nginx nie ma możliwości wpływania na środowisko php, ponieważ nie osadza on w swoim procesie interpretera php. Przekazuje parametry do php poprzez dyrektywy fastcgi_param. Można tylko dodać jedną gdzie resztę swoich params ustawionego i uzyskać do niego dostęp poprzez $ _SERVER:

location ~ \.php$ { 
    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $request_filename; 
    fastcgi_param SOMEENV test; 
    fastcgi_pass php; 
} 
+1

Witam, dziękuję za odpowiedź. Okej, co pozwala mi wstrzyknąć do $ _SERVER ['SOMEENV'], ale jak mogę zapewnić coś dla $ _ENV ['SOMEENV']? – Josh

+1

Wpisy tablicy _SERVER są tworzone przez serwer WWW, ale zmienne $ _ENV są ​​importowane ze środowiska, w którym działa interpreter PHP, a wiele z nich jest dostarczanych przez powłokę, pod którą działa PHP. W przypadku Apache, interpreter php jest wbudowany w proces Apache, ale tak nie jest w przypadku Nginx. IOW, Możliwe jest ustawienie zmiennych $ _ENV za pomocą Nginx i $ _SERVER jest tak dobre, jak to tylko możliwe. – Dayo

+0

Czy w NGINX nie ma dyrektywy 'env'? – CMCDragonkai

6

Należy pamiętać, że dostępność $_ENV zmiennych zależy od ustawienia variables_order w php.ini używanego przez PHP- fpm. Wartość domyślna to EGPCS, gdzie E jest środowiskiem, jednak w systemie Ubuntu 12.04 stwierdziłem, że jest to GPCS. Sam php.ini niesie ostrzeżenie dotyczące $_ENV:

; This directive determines which super global arrays are registered when PHP 
; starts up. G,P,C,E & S are abbreviations for the following respective super 
; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty 
; paid for the registration of these arrays and because ENV is not as commonly 
; used as the others, ENV is not recommended on productions servers. 

zaleca korzystania getenv() który jest zawsze dostępny. Odkryłem, że zmienne, które ustawiłem w puli FPM, mogą zostać pobrane w ten sposób.

+1

Możesz uzyskać dostęp do zmiennych zadeklarowanych w pliku conf php-fpm, ponieważ getenv() wyszukuje zarówno $ _ENV, jak i $ _SERVER jak podano tutaj: http://stackoverflow.com/questions/3780866/why-is-my-env-empty – LeandroCR

+0

getenv() nie działa w ten sam sposób – deFreitas

0

Ustawiam wszystkie env [...] = zmienne w php-fpm.d/www.conf Po wypróbowaniu weekendu, znalazłem jedyny sposób na dostęp do tych zmiennych za pomocą $ _SERVER, a $ _ENV nie może uzyskać dostępu te zmienne. Czy ktoś może dać pomysł?