Предоставить переменные окружения для Apache и PHP

1

Задний план

Я пытаюсь использовать Wercker для запуска моего теста для приложения PHP. Wercker использует контейнеры Docker для настройки тестовой среды для выполнения тестов. Он использует переменные среды для отображения параметров подключения для любых подключенных сервисов, таких как MySQL и Elasticsearch. Пример MYSQL_PORT_3306_TCP_ADDR = 127.0.1.1

В моих основных контейнерах Docker работает Ubuntu 14.04 с PHP и Apache, уже установленными на контейнере.

проблема

Кажется, я не могу получить доступ к переменным среды через php $ _SERVER или $ _ENV при работе через Apache. Он отлично работает, если я запускаю скрипт через CLI php./db_connect.php или если я запускаю PHP, используя его сборку на сервере php -S localhost:8000. Однако, если я попытаюсь получить доступ к странице через виртуальный хост Apache, переменные окружения недоступны.

Прогресс

Я установил 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

Я прочитал этот вопрос. Как получить переменные системной среды в PHP при запуске CLI и Apache2Handler? но я не уверен, что он предлагает делать.

Вопрос

Как открыть переменные System Environment для Apache и PHP?

  • 0
    Вы пробовали $_ENV['MYSQL_PORT_3306_TCP_ADDR'] ? Обратите внимание, что переменные среды для ссылок устарели и больше не устанавливаются для новых пользовательских сетей в Docker 1.9 и выше. Лучший способ - подключиться, используя имя связанного контейнера, например, http://mysql для подключения к контейнеру «mysql». Переменные среды мало что добавили, потому что для получения IP-адреса вам нужны и имя, и номер порта , поэтому в любом случае проще использовать имя контейнера.
  • 0
    Да, пытались получить доступ к переменным окружения из $ _ENV и $ HTTP_ENV_VARS, просто чтобы быть уверенным. Решение для связи с контейнером может работать, единственная проблема состоит в том, что контейнер предоставляет дополнительную информацию, такую как таблица базы данных, которую он создает при установке $ _SERVER ["MYSQL_ENV_MYSQL_DATABASE"], и случайный корневой пароль $ _SERVER ['MYSQL_ENV_MYSQL_ROOT_PASSWORD'], который мне также нужен.
Теги:
docker

2 ответа

1

С компоновкой докеров вы можете получить переменные среды операционной системы, заданные параметром environment файла docker-compose.yml, через переменную php $_ENV.

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

  • 0
    Действительно, это то, что должно работать, но исходя из того, что я испытал, и вопроса, кажется, что «docker + apache + php» не обязательно передает эти переменные окружения в php. IDK, при каких обстоятельствах это является проблемой, но я видел это в среде, в которой не было wercker - поэтому речь идет о настройках apache или о том, как docker передает переменные в apache.
0

Вот решение:

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>

Теперь они будут доступны в PHP через суперглобальный массив $ _SERVER.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню