使用nginx/php fpm设置$\u ENV(fka$HTTP\u ENV\u VARS)

使用nginx/php fpm设置$\u ENV(fka$HTTP\u ENV\u VARS),nginx,environment-variables,php,Nginx,Environment Variables,Php,在apache环境中,setenv的等价物是什么? 例如,使用apache,我可以设置env“SOMEENV”并通过$_env['SOMEENV']在php中访问它,但我不知道如何使用nginx+php fpm来实现 我最初认为我只需要在php fpm池的配置中设置ENV[SOMENEV]=test,但是var_dump($_ENV)仍然不返回任何结果 有什么提示吗?nginx没有办法影响php的环境,因为它没有将php解释器嵌入到其进程中。它通过指令将参数传递给php。您只需在设置其余参数的位

在apache环境中,setenv的等价物是什么? 例如,使用apache,我可以设置env“SOMEENV”并通过$_env['SOMEENV']在php中访问它,但我不知道如何使用nginx+php fpm来实现

我最初认为我只需要在php fpm池的配置中设置ENV[SOMENEV]=test,但是var_dump($_ENV)仍然不返回任何结果


有什么提示吗?

nginx没有办法影响php的环境,因为它没有将php解释器嵌入到其进程中。它通过指令将参数传递给php。您只需在设置其余参数的位置添加一个参数,然后通过$\u服务器访问它:

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

请注意,
$\u ENV
变量的可用性取决于php fpm使用的php.ini中
变量的顺序设置。默认值是
EGPCS
,其中
E
是环境,但是在Ubuntu 12.04上我发现它是
GPCS
。php.ini本身带有一个关于
$\u 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.

它建议使用始终可用的
getenv()
。我发现我在FPM池中设置的变量可以通过这种方式检索。

您好,谢谢您的回复。好的,这允许我注入到$_服务器['SOMEENV'],但是我如何为$_ENV['SOMEENV']提供一些东西呢?$_服务器数组条目是由Web服务器创建的,但是$_ENV变量是从运行PHP解释器的环境导入的,许多是由运行PHP的shell提供的。在Apache中,php解释器嵌入到Apache进程中,但在Nginx中并非如此。注意,可以使用Nginx设置$\u ENV变量,并且$\u服务器已尽其所能。Nginx中是否有
ENV
指令?是的,但它只影响Nginx主进程和工作进程的环境()。由于php不像apache上的mod_php那样在nginx内部运行,nginx实际上不会影响php的环境。您可以访问php fpm conf文件中声明的变量,因为getenv()同时搜索$_ENV和$_SERVER,如下所述: