【问题标题】:php 7 $_ENV && getenv() empty with EGPCS setphp 7 $_ENV && getenv() 为空并设置了 EGPCS
【发布时间】:2016-08-22 11:09:10
【问题描述】:

我的服务器有以下设置,

ec2 -> centos7

httpd 2.4
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

php 7 -> 
php.ini
variables_order=EGPCS

和一个用

在 centos 中设置的 ENV var

导出 myTestDir=/home/myuser

[myUser@.....]$ echo $myTestDir
/home/myuser

但是我无法让任何系统 ENV var 在 php 中可用。

echo exec('whoami');                      // returns -> myUser
$_SESSION['test1']=$_SERVER['myTestDir']; // returns -> null
$_SESSION['test2']=$_ENV['myTestDir'];    // returns -> null
$_SESSION['test3']=getenv("myTestDir");   // returns -> false

我是否错过了额外的步骤或对variables_order=EGPCS 做错了什么

【问题讨论】:

    标签: php apache centos7 php-7


    【解决方案1】:

    PHP 的环境与您在 shell 中使用的用户环境是隔离的。这是设计使然,因为 PHP 要求您将变量显式导入其环境。它不会隐含地这样做,因为这可能会带来巨大的安全风险。

    From the manual

    这些变量从 PHP 解析器运行的环境导入到 PHP 的全局命名空间中。许多是由运行 PHP 的 shell 提供的,不同的系统可能运行不同类型的 shell,不可能有一个明确的列表。有关已定义环境变量的列表,请参阅您的 shell 文档。

    因此,为了将环境变量加载到 PHP 中,您必须在加载 PHP 解释器的进程级别执行此操作。例如,在 Apache httpd 中,使用 mod_php,这可以通过在 apache.conf 或虚拟主机文件中指定 SetEnv 指令来完成。

    对于 PHP-FPM,这将在您的池配置文件中完成,例如 env[myTestDir] = "/home/myuser"

    【讨论】:

    • 完美 我错过了需要在池下设置env[] 的内容。你知道每个 var 是否必须手动添加到 .conf 文件中,还是可以从 /etc/environment 中读取?我尝试设置变量并重新加载,但冷不让他们看到,所以我假设没有。谢谢艺术
    • 不,这就是重点。如果 PHP 隐式导入您的环境,这将是一个非常严重的安全问题。您必须明确指定要导入 PHP 环境的内容。
    猜你喜欢
    • 2012-02-06
    • 2012-01-23
    • 2016-05-20
    • 1970-01-01
    • 2011-04-16
    • 2014-05-10
    相关资源
    最近更新 更多