[英]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.