向 Apache 和 PHP 公开环境变量

Lev*_*tna 7 php apache ubuntu docker

背景

我正在尝试使用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,它工作正常php -S localhost:8000。但是,如果我尝试通过 Apache 虚拟主机访问页面,则环境变量不可用。

进步

我已经使用 mod 设置了 Apache,用于允许环境变量“我认为”

sudo a2enmod env
sudo service apache2 restart
Run Code Online (Sandbox Code Playgroud)

我正在尝试访问脚本中的环境变量。

$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"];
Run Code Online (Sandbox Code Playgroud)

我可以在我的 .htaccess 中添加新变量,我只是没有获得所有系统环境变量。

SetEnv TEST_VAR test
Run Code Online (Sandbox Code Playgroud)

我已经阅读了这个问题How to get system environment variables into PHP while running CLI & Apache2Handler? 但我不确定它的建议是什么。

题

如何向 Apache 和 PHP 公开系统环境变量?

Mat*_*dak 7

这是解决方案:

Docker 会将这些传递给 apache,但您必须配置 apache 才能使它们可供 PHP 使用。

在本地 .env 文件中设置值

MYSQL_PORT_3306_TCP_ADDR=1234
MYSQL_ENV_MYSQL_USER=development
MYSQL_ENV_MYSQL_PASSWORD=password    
Run Code Online (Sandbox Code Playgroud)

然后将这些作为环境参数添加到 docker-compose.yml 文件中

version: 2
services:
  web:
  build: php:5.6-apache
  environment:
    MYSQL_PORT_3306_TCP_ADDR:${MYSQL_PORT_3306_TCP_ADDR}
    MYSQL_ENV_MYSQL_USER: ${MYSQL_ENV_MYSQL_USER}
    MYSQL_ENV_MYSQL_PASSWORD: ${MYSQL_ENV_MYSQL_PASSWORD}
Run Code Online (Sandbox Code Playgroud)

然后将它们传递给 PHP,将它们设置为虚拟主机配置中的环境参数

<VirtualHost *:80>
    ServerName some-project

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/some-project

    # Set apache environment variables
    SetEnv MYSQL_PORT_3306_TCP_ADDR ${MYSQL_PORT_3306_TCP_ADDR}
    SetEnv MYSQL_ENV_MYSQL_USER ${MYSQL_ENV_MYSQL_USER}
    SetEnv MYSQL_ENV_MYSQL_PASSWORD ${MYSQL_ENV_MYSQL_PASSWORD}
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

现在可以通过 $_SERVER 超级全局数组在 PHP 中访问这些内容。

<?php
    echo $_SERVER['MYSQL_ENV_MYSQL_USER'];
Run Code Online (Sandbox Code Playgroud)


bax*_*ico 5

如果您使用的是php 官方 Docker 映像,则必须将环境变量从 Apache 显式传递到 PHP。你可以这样做:

在您的 Dockerfile 中:

FROM php:7.2-apache
RUN echo 'SetEnv MYSQL_USER ${MYSQL_USER}' > /etc/apache2/conf-enabled/environment.conf
Run Code Online (Sandbox Code Playgroud)

environment.conf是一个任意名称,但它应该放在/etc/apache2/conf-enabled/.

在 docker-compose.yml 中:

version: '2'
services:
    yourservice:
        build: ./yourimage
        image: yourimage
        ports:
            - 8080:80
        volumes:
            - ../html:/var/www/html
        environment:
            MYSQL_USER: foo
Run Code Online (Sandbox Code Playgroud)

在您的 PHP 脚本中:

echo getenv('MYSQL_USER');
Run Code Online (Sandbox Code Playgroud)

  • 最佳答案。没有必要搞乱配置文件。非常简单的解决方案,同时将所有控制保留在 Dockerfile/docker-compose 中。 (3认同)

小智 1

environment使用 docker-compose,您可以通过 php 的变量检索使用 docker-compose.yml 文件的选项设置的操作系统环境变量$_ENV。

version: 2
services:
  web:
    build: php:5.6-apache
    environment:
      MYSQL_USER: "user"
      MYSQL_PASSWORD: "passwd"
Run Code Online (Sandbox Code Playgroud)

应该给你

$_ENV['MYSQL_USER'] = user
$_ENV['MYSQL_PASSWORD'] = passwd
Run Code Online (Sandbox Code Playgroud)

我不确定 Wercker 如何将环境变量映射到容器,但我认为这个未解决的问题可能会有所帮助 https://github.com/wercker/wercker/issues/63

  • 事实上,这就是*应该*工作的,但是根据我的经验和问题,似乎“docker + apache + php”不一定将这些环境变量传递给php。IDK 在什么情况下这是一个问题,但我在不包含 wercker 的环境中看到过这个问题 - 所以这与 apache 设置有关,或者 docker 如何将变量传递给 apache 有关。 (2认同)