【发布时间】:2016-06-27 10:53:25
【问题描述】:
背景
我正在尝试使用 Wercker 来运行我的 PHP 应用程序测试。 Wercker 使用 Docker 容器来设置一个测试环境来执行测试。它使用环境变量来公开任何连接的服务(如 MySQL 和 Elasticsearch)的连接参数。示例 MYSQL_PORT_3306_TCP_ADDR = 127.0.1.1
我的核心 Docker 容器正在运行 Ubuntu 14.04,容器上已经安装了 PHP 和 Apache。
问题
通过 Apache 运行时,我似乎无法通过 php $_SERVER 或 $_ENV 访问环境变量。如果我通过 CLI php ./db_connect.php 运行脚本,或者如果我使用其内置服务器 php -S localhost:8000 运行 PHP,它工作正常。但是,如果我尝试通过 Apache 虚拟主机访问页面,则环境变量不可用。
进展
我已经使用用于允许环境变量“我认为”的 mod 设置 Apache
sudo a2enmod env
sudo service apache2 restart
我正在尝试访问脚本中的环境变量。
$database_host = $_SERVER["MYSQL_PORT_3306_TCP_ADDR"];
$database_username = $_SERVER["MYSQL_ENV_MYSQL_USER"];
$database_password = $_SERVER["MYSQL_ENV_MYSQL_PASSWORD"];
$database_name = $_SERVER["MYSQL_ENV_MYSQL_DATABASE"];
$elasticsearch_host = $_SERVER["ELASTICSEARCH_PORT_9300_TCP_ADDR"];
我可以在我的 .htaccess 中添加新变量,我只是没有得到所有的系统环境变量。
SetEnv TEST_VAR test
我已经阅读了这个问题How to get system environment variables into PHP while running CLI & Apache2Handler?,但我不确定它的建议是什么。
问题
如何向 Apache 和 PHP 公开系统环境变量?
【问题讨论】:
-
你试过
$_ENV['MYSQL_PORT_3306_TCP_ADDR']吗?请注意,不推荐使用链接的环境变量,并且不再为 docker 1.9 及更高版本中的新自定义网络设置。更好的方法是使用链接的容器的名称进行连接,例如http://mysql连接到“mysql”容器。环境变量并没有添加太多,因为你需要name和port号来获取ip地址,所以使用容器的名称无论如何更容易. -
是的,已尝试从 $_ENV 和 $HTTP_ENV_VARS 访问环境变量以确保安全。容器链接解决方案可能有效,唯一的问题是容器公开了附加信息,例如它在设置 $_SERVER["MYSQL_ENV_MYSQL_DATABASE"] 和我还需要的随机 root 密码 $_SERVER['MYSQL_ENV_MYSQL_ROOT_PASSWORD'] 上创建的数据库表。