我在Centos上使用PHP作为PHP-FPM。我正在尝试遵循http://12factor.net/指南,将设置存储在环境变量中。
我在/etc/profile.d中创建了一个文件来设置我想要的环境变量,并且在CLI中通过Bash进行测试时出现环境变量,即运行bash脚本:
var nsTimerObject:NSTimer = NSTimer.scheduledTimerWithTimeInterval(showCodeDelay, target: self, selector: "showCode(counterCode1)", userInfo: nil, repeats: false);
显示正确的输出。
我已将clear_env设置设为false,将variables_order设置为echo $SOME_SERVER_SETTING
,但是,我设置的变量不会在PHP中显示EGPCS
或执行getenv('SOME_SERVER_SETTING')
需要设置哪些其他设置才能让PHP-FPM接收所有服务器环境变量,特别是那些通过Centos上/etc/profiles.d中的shell脚本设置的变量?
答案 0 :(得分:10)
使用Systemd服务和PHP 5.6.4在Centos 7上测试
OPEN
/etc/php.ini
FIND
variables_order = "GPCS"
替换
variables_order = "EGPCS"
# http://php.net/manual/ru/ini.core.php#ini.variables-order
OPEN
/etc/php-fpm.d/www.conf (maybe /etc/php5/fpm/pool.d/www.conf)
(do not confuse with /etc/php-fpm.conf)
如果存在,则查找
clear_env = yes
替换或添加
clear_env = no
# http://php.net/manual/en/install.fpm.configuration.php
OPEN
/etc/environment
ADD
#any variables you need, for example:
MY_VAR=1234
在壳中跑去检查
source /etc/environment
echo $MY_VAR # 1234
在壳中运行
ln -fs /etc/environment /etc/sysconfig/php-fpm
systemctl daemon-reload && service php-fpm restart
... TESTING
OPEN
index.php # in your project folder, running with php-fpm
ADD
var_dump(getenv('MY_VAR'), $_ENV['MY_VAR']);exit;
浏览器浏览器
http://mylink.to.project/index.php
string(4) "1234"
string(4) "1234"
享受!
答案 1 :(得分:3)
安全理由: - )
请参阅/etc/php5/fpm/pool.d/www.conf
(debian位置,可能在CentOs上有所不同)
; Clear environment in FPM workers
; Prevents arbitrary environment variables from reaching FPM worker processes
; by clearing the environment in workers before env vars specified in this
; pool configuration are added.
; Setting to "no" will make all environment variables available to PHP code
; via getenv(), $_ENV and $_SERVER.
; Default Value: yes
;clear_env = no
; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
; Default Value: clean env
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp
答案 2 :(得分:1)
您需要从正确的位置读取环境变量。 PHP为此创建了一个超级全局变量:$_ENV
因此,您可以通过访问该变量中的某个元素来访问单个变量,该变量包含一个数组:echo $_ENV['SOME_SERVER_SETTING'];
我不知道为什么上面的示例应该在CLI上运行。超级全局变量是记录的位置并且有效。
这里可能存在的问题是没有为http服务器进程设置变量。通常,在/etc/profile.d
中的脚本会在登录时执行。因此,当用户在系统内创建会话时。但是,作为系统服务器启动的http服务器永远不会发生这种情况。不执行登录,不执行任何配置文件脚本,也不设置环境变量。
要解决此问题,您可以
.htaccess
样式文件答案 3 :(得分:1)
FastCGI设置中的环境变量由FPM进程的客户端设置为输入,例如NginX。它们作为标题发送到FastCGI服务器,它解释它们并相应地设置它们以便您使用getenv读出。
如果您实际上正在使用NginX,请查找fastcgi_param指令。您还可以在php5-fpm的池配置中设置环境变量,具体取决于您的用例。