如何让PHP能够读取系统环境变量

时间:2015-06-13 19:29:26

标签: php centos environment-variables

我在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脚本设置的变量?

4 个答案:

答案 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的池配置中设置环境变量,具体取决于您的用例。