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

如何让PHP能够读取系统环境变量,php,centos,environment-variables,Php,Centos,Environment Variables,我在Centos上使用PHP作为PHP-FPM。我试图遵循将设置存储在环境变量中的指导原则 我在/etc/profile.d中创建了一个文件,该文件设置了我想要的环境变量,当通过Bash在CLI中测试时,即运行Bash脚本时,会显示环境变量: echo $SOME_SERVER_SETTING 显示正确的输出 我已经将clear_env设置设置为false,variables_order设置为EGPCS,但是,我设置的变量在PHPgetenv('SOME_SERVER_设置')或doingva

我在Centos上使用PHP作为PHP-FPM。我试图遵循将设置存储在环境变量中的指导原则

我在/etc/profile.d中创建了一个文件,该文件设置了我想要的环境变量,当通过Bash在CLI中测试时,即运行Bash脚本时,会显示环境变量:

echo $SOME_SERVER_SETTING
显示正确的输出

我已经将clear_env设置设置为false,variables_order设置为
EGPCS
,但是,我设置的变量在PHP
getenv('SOME_SERVER_设置')
或doing
var_dump($\u env)


需要设置哪些其他设置以允许PHP-FPM接收所有服务器环境变量,特别是通过Centos上/etc/profiles.d中的shell脚本设置的服务器环境变量?

您需要从正确的位置读取环境变量。PHP为此创建了一个超级全局变量:
$\u ENV
,因此您可以通过访问该变量中的某个元素来访问单个变量,该元素包含一个数组:
echo$\u ENV['SOME_SERVER_SETTING']

我不知道为什么上面的示例应该在CLI上工作。超级全局变量是记录的位置和工作方式

这里可能存在的问题是没有为http服务器进程设置变量。通常在登录时执行
/etc/profile.d
中的脚本。因此,当用户在系统内创建会话时。但是,对于作为系统服务器启动的http服务器,这种情况永远不会发生。不执行登录,不执行配置文件脚本,不设置环境变量

要解决这个问题,你可以

  • 在服务的启动脚本中设置环境变量
  • 在主机配置或
    .htaccess
    样式文件中设置变量
  • 设置变量的脚本的自动前置
安全原因:-)

请参见
/etc/php5/fpm/pool.d/www.conf
(debian位置在CentOs上可能不同)


FastCGI设置中的环境变量由FPM进程的客户端设置为输入,例如NginX。它们作为标题发送到FastCGI服务器,该服务器解释并相应地设置它们,以便您使用getenv读取


如果您实际上正在使用NginX,请查找fastcgi_param指令。您还可以在php5 fpm的池配置中设置环境变量,具体取决于您的用例。

在Centos 7上使用Systemd service和php5.6.4进行测试

打开

发现

取代

variables_order = "EGPCS"
# http://php.net/manual/en/ini.core.php#ini.variables-order
打开

查找是否存在

clear_env = yes
替换或添加

clear_env = no
# http://php.net/manual/en/install.fpm.configuration.php
打开

在SHELL中运行以进行检查

source /etc/environment
echo $MY_VAR # 1234
脱壳

ln -fs /etc/environment /etc/sysconfig/php-fpm
systemctl daemon-reload && service php-fpm restart
…测试

打开

在浏览器中运行

http://mylink.to.project/index.php   
string(4) "1234"
string(4) "1234"

享受吧

我在问题中说我已经将clear_env设置为no。你真的将其设置为“no”了吗?在你最初的帖子中,你写了“假”。我只得到用户和主环境变量,但如果我在上面的文件中设置clear_env=no,我会得到术语PATH PWD等。我也通过php_admin_value[clear_env]设置它,这就是为什么它不工作的原因。我澄清了-这是在CLI中使用Bash而不是php进行测试。您可以展开“在服务的启动脚本中设置环境变量”吗。我在登录服务器时进行测试,并通过init.d脚本重新启动PHP-FPM。我原以为这会带来环境变量,因为PHP-FPM进程是从登录的根进程启动的。此外,仅调用在init.d脚本中设置环境变量的脚本似乎没有改变。在个人会话中设置的环境变量(通常)不会通过某个init脚本移交给启动的进程,因为该服务是在另一个用户帐户下执行的。即使是这样,也无法真正解决您的问题,因为在正常情况下,您不会手动启动服务。相反,它将由启动序列启动,在启动序列中也没有登录。正如你所说,“根进程”没有执行任何登录。我想你是对的,在启动脚本中设置变量不起作用。。。否则,手动运行该脚本将移交显然不是这样的变量。虽然。。。实际上,不确定。除了设置它们之外,还可以尝试“导出”它们。嗯,但是您在这里对/etc/environment中的变量进行了硬编码。为什么不使用export=val添加而不是硬编码?这取决于您,这就是一个示例
clear_env = no
# http://php.net/manual/en/install.fpm.configuration.php
/etc/environment
#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
index.php # in your project folder, running with php-fpm
var_dump(getenv('MY_VAR'), $_ENV['MY_VAR']);exit;
http://mylink.to.project/index.php   
string(4) "1234"
string(4) "1234"