首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向Apache和PHP公开环境变量

问向Apache和PHP公开环境变量
EN

Stack Overflow用户
提问于 2016-03-12 10:24:19
回答 5查看 11.8K关注 0票数 8

背景

我正在尝试使用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 -S localhost:8000中构建的php ./db_connect.php运行它,它工作得很好。但是,如果我尝试通过Apache虚拟主机访问页面,则环境变量不可用。

进展

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

代码语言:javascript
复制
sudo a2enmod env
sudo service apache2 restart

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

代码语言:javascript
复制
$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中添加新的变量,我只是不能得到所有的系统环境变量。

代码语言:javascript
复制
SetEnv TEST_VAR test

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

问题

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

EN

回答 5

Stack Overflow用户

发布于 2020-07-29 01:34:44

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

在Dockerfile中:

代码语言:javascript
复制
FROM php:7.2-apache
RUN echo 'SetEnv MYSQL_USER ${MYSQL_USER}' > /etc/apache2/conf-enabled/environment.conf

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

在docker-compose.yml中:

代码语言:javascript
复制
version: '2'
services:
    yourservice:
        build: ./yourimage
        image: yourimage
        ports:
            - 8080:80
        volumes:
            - ../html:/var/www/html
        environment:
            MYSQL_USER: foo

在PHP脚本中:

代码语言:javascript
复制
echo getenv('MYSQL_USER');
票数 6
EN

Stack Overflow用户

发布于 2019-04-11 21:57:18

以下是的解决方案:

Docker会将它们传递给apache,但您必须配置apache以使其可用于PHP。

设置本地.env文件中的值

代码语言:javascript
复制
MYSQL_PORT_3306_TCP_ADDR=1234
MYSQL_ENV_MYSQL_USER=development
MYSQL_ENV_MYSQL_PASSWORD=password    

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

代码语言:javascript
复制
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}

然后将这些参数传递给PHP,在虚拟主机配置中将这些参数设置为环境参数

代码语言:javascript
复制
<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>

现在可以通过$_SERVER超级全局数组在PHP中访问它们。

代码语言:javascript
复制
<?php
    echo $_SERVER['MYSQL_ENV_MYSQL_USER'];
票数 4
EN

Stack Overflow用户

发布于 2021-05-31 01:41:41

如果您正在使用PHP FPM,则可以通过/path/to/php/fpm/pool.d/www.conf等文件中的clear_env ini设置将环境变量从OS传递给-FPM

代码语言:javascript
复制
clear_env = no

它使用通过docker-compose.yml设置的environment变量,如下所示:

代码语言:javascript
复制
version: "..."

services:
    php-fpm:
        image: php:7-fpm
        environment:
            MY_VAR: my-value

重要提示:当然,风险在于您的PHP-FPM将获得所有操作系统环境变量的访问权。如果传递所有var有问题,也可以通过www.conf或其他php ini配置文件仅传递特定的var:

代码语言:javascript
复制
; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
env[MY_VAR] = $MY_VAR
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35953019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档