簡體   English   中英

向 Apache 和 PHP 公開環境變量

[英]Expose environment variables to Apache and PHP

背景

我正在嘗試使用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 公開系統環境變量?

如果您使用的是php 官方 Docker 映像,則必須將環境變量從 Apache 顯式傳遞到 PHP。 你可以這樣做:

在您的 Dockerfile 中:

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 中:

version: '2'
services:
    yourservice:
        build: ./yourimage
        image: yourimage
        ports:
            - 8080:80
        volumes:
            - ../html:/var/www/html
        environment:
            MYSQL_USER: foo

在您的 PHP 腳本中:

echo getenv('MYSQL_USER');

這是解決方案:

Docker 會將這些傳遞給 apache,但您必須配置 apache 以使它們可用於 PHP。

在本地 .env 文件中設置值

MYSQL_PORT_3306_TCP_ADDR=1234
MYSQL_ENV_MYSQL_USER=development
MYSQL_ENV_MYSQL_PASSWORD=password    

然后將這些作為環境參數添加到 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}

然后將這些傳遞給 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>

這些現在可以通過 $_SERVER 超級全局數組在 PHP 中訪問。

<?php
    echo $_SERVER['MYSQL_ENV_MYSQL_USER'];

如果您使用的是php-fpm ,您可以通過像/path/to/php/fpm/pool.d/www.conf這樣的文件中的clear_env ini 設置將環境變量從操作系統傳遞到 PHP-FPM:

clear_env = no

它適用於通過docker-compose.yml設置的environment變量,如下所示:

version: "..."

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

重要提示:當然,風險在於您的 PHP-FPM 將可以訪問所有操作系統環境變量。 如果傳遞所有變量有問題,您還可以通過www.conf或另一個 php ini 配置文件僅傳遞特定變量:

; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
env[MY_VAR] = $MY_VAR

使用 docker-compose,您可以通過 php 的$_ENV變量檢索使用 docker-compose.yml 文件的environment選項設置的操作系統環境變量。

version: 2
services:
  web:
    build: php:5.6-apache
    environment:
      MYSQL_USER: "user"
      MYSQL_PASSWORD: "passwd"

應該給你

$_ENV['MYSQL_USER'] = user
$_ENV['MYSQL_PASSWORD'] = passwd

我不確定 Wercker 如何將環境變量映射到容器,但我認為有一個未解決的問題可能會有所幫助https://github.com/wercker/wercker/issues/63

您可以使用如下所示的 php 命令檢查 get env

php -r "echo getenv('MYSQL_USER');"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM