【问题标题】:Cant access environment variables in phpphp无法访问环境变量
【发布时间】:2014-02-11 22:34:19
【问题描述】:

我在 php 中访问操作系统环境变量时遇到问题 我在 centos 6.3 映像上安装了 apache/php

在 httpd.conf mod mod_env.so 中加载 在 php.ini 我设置 variables_order = "EGPCS" 重新启动 httpd(多次)

如果我在 shell 中输入“env”,我会得到 ​​p>

DB_PORT_28017_TCP_PROTO=tcp 
HOSTNAME=c6188a8bd77f
DB_NAME=/rockmongo/db
DB_PORT_27017_TCP=tcp://172.17.0.36:27017
TERM=xterm
DB_PORT_28017_TCP_PORT=28017
DB_PORT=tcp://172.17.0.36:27017
DB_PORT_27017_TCP_PORT=27017
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/etc/php.d
DB_PORT_27017_TCP_PROTO=tcp
DB_PORT_28017_TCP_ADDR=172.17.0.36
DB_PORT_28017_TCP=tcp://172.17.0.36:28017
SHLVL=1
HOME=/
DB_PORT_27017_TCP_ADDR=172.17.0.36
container=lxc
_=/usr/bin/env
OLDPWD=/etc

后面有变量,但是如果我在 php 中执行 print_r($_ENV); 我得到

Array ( [TERM] => xterm [PATH] => /sbin:/usr/sbin:/bin:/usr/bin [PWD] => / [LANG] => C [SHLVL] => 2 [_] => /usr/sbin/httpd ) 

还查看了 $_SERVER 和 $GLOBALS。

有趣的是,如果我在 shell 中执行 php -i,我会看到 _ENV 中正确设置了 env 变量

我应该注意到我在 docker 容器中运行它,但是我不认为这是一个问题,因为变量在 #env 和 #php -i 中正确显示。我认为我的 httpd/php 配置有问题

有人对此有什么建议吗? 谢谢

【问题讨论】:

标签: php apache centos environment-variables docker


【解决方案1】:

最近我编写了一个库来从环境变量中获取值并解析为 PHP 数据类型。该库可用于将环境变量解析为 PHP 数据类型(如转换为整数、浮点数、空值、布尔值),解析 JSON 字符串等复杂数据结构,以及更多社区的贡献。

该库在此处可用:https://github.com/jpcercal/environment

正如你所说,环境已经加载。然后,从环境变量(独立于环境 CLI、Apache、Nginx、PHP 内置服务器等)获取值:

<?php
// ...
require "vendor/autoload.php";
// ...
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME"));

尽情享受吧。

【讨论】:

  • 我尝试使用该库。从 cli 运行 php 时工作正常。但是,我无法使用 apache 访问 php 中的变量。
  • 我不知道你的设置,但是使用 apache 你应该像这样设置环境变量:SetEnv VARIABLE_NAME variable_value 或者你可以使用另一个库从文件中设置这个环境变量:github.com/vlucas/phpdotenv
【解决方案2】:

我最终有几个选择

  1. 如果 docker 容器需要运行多个服务,将 env vars 设置为 /etc/environment 将使它们可供所有用户使用。我将以下行添加到我的 Dockerfile CMD

    CMD ["env | grep _ &gt;&gt; /etc/environment"]

  2. 如果 docker 容器运行单个服务,最好将入口点设置为所需的应用程序,env vars 将自动传递给应用程序用户。这是我运行 apache 的 Dockerfile CDM & ENTRYPOINT

    ENTRYPOINT ["/usr/sbin/httpd"] CMD ["-D", "FOREGROUND"]

【讨论】:

【解决方案3】:

达贡是正确的。

除非您以 Web 服务器用户(apache?)身份登录,否则您可能看不到相同的环境变量。不过,您可以使用 phpinfo 测试文件轻松查看它们:

<?php
phpinfo();
?>

或者您可以使用 .htaccess 文件自行设置:

SetEnv HTTP_MY_VARIABLE "my value";

来自 dwitz:您还可以通过以下方式使环境变量在系统范围内可用:

env | grep _ >> /etc/environment

抱歉还不能发表评论...所以必须创建一个答案。

【讨论】:

  • phpinfo 显示与 print_r($_ENV) 相同的变量;每次启动docker镜像时环境变量都是动态的,所以我不能手动设置。您是否建议 php 无法访问 env 变量,因为它以 apache 用户身份运行?我的shell命令'env'以root身份执行
  • Shell 环境变量是为您登录的用户设置的。这可能与作为 apache 用户运行的 php 不同,将会看到。在信息页面上查看 PHP 变量部分。 php.net/manual/en/reserved.variables.server.php
  • 您对用户/环境变量的可用性是正确的。如果我执行runuser -l apache -c 'php -i'runuser -l apache -c 'env' 我看不到我所追求的环境变量。它们似乎只适用于 root
  • 在 phpinfo 页面上查看 Apache 环境部分。我在上面给出的 PHP 手册链接上有一个元素索引。
  • 不确定,但 MongoDB 是否应该设置该变量 DB_PORT_28017_TCP_ADDR?喜欢 MONGODB_ADDRESS?如果是这样,您可能希望将其放入 config.php 文件或自动加载找到它并在会话期间设置它的类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 2021-05-05
  • 2014-07-29
  • 2018-03-17
  • 2017-07-31
  • 2014-08-29
  • 2021-04-23
相关资源
最近更新 更多