2014-01-22 5 views
0

Im имеющие проблемы с доступом переменные окружения ОС в PHP У меня есть Apache/PHP, установленный на CentOS 6.3 изображенияCant переменные среды доступа в PHP

в httpd.conf мод mod_env.so загружается в php.ini I установили variables_order = «EGPCS» перезапущен HTTPD (много раз)

в оболочке, если я типа «окр» Я получаю

DB_PORT_28017_TCP_PROTO=tcp 
HOSTNAME=c6188a8bd77f 
DB_NAME=/rockmongo/db 
DB_PORT_27017_TCP=tcp://172.17.0.36:27017 
TERM=xterm 
DB_PORT_28017_TCP_PORT=28017 
DB_PORT=tcp://172.17.0.36:27017 
DB_PORT_27017_TCP_PORT=27017 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
PWD=/etc/php.d 
DB_PORT_27017_TCP_PROTO=tcp 
DB_PORT_28017_TCP_ADDR=172.17.0.36 
DB_PORT_28017_TCP=tcp://172.17.0.36:28017 
SHLVL=1 
HOME=/ 
DB_PORT_27017_TCP_ADDR=172.17.0.36 
container=lxc 
_=/usr/bin/env 
OLDPWD=/etc 

, который имеет переменные им после, однако, если я исполню print_r($_ENV); в PHP я получаю

Array ([TERM] => xterm [PATH] => /sbin:/usr/sbin:/bin:/usr/bin [PWD] =>/[LANG] => C [SHLVL] => 2 [_] => /usr/sbin/httpd) 

также смотрели в $ _SERVER & $ GLOBALS.

Интересно, если я исполню php -i в оболочке я вижу переменные ENV заданы правильно в _ENV

Я должен отметить это работает чат в Докер контейнере, однако я не считаю, что это вопрос, как переменные корректно отображаются в #env & #php -i. Я думаю, что у меня проблема с моей конфигурацией httpd/php

У кого-нибудь есть совет для этого? спасибо

+0

'print_r ($ _ SERVER);' –

+0

попробовал оба print_r ($ _ SERVER); & print_r ($ GLOBALS); нет удачи Извините, должно быть, упомянул, что – dwitz

+0

, какая конкретная переменная вам нужна –

ответ

1

Я закончил тем, что несколько вариантов

  1. если докер контейнер необходимо запустить несколько служб, установку окр варов в/и т.д./окружающую среду сделает их доступными для всех пользователей. Я добавил следующую строку в моей Dockerfile CMD

    CMD ["env | grep _ >> /etc/environment"]

  2. если докер контейнер запускает один сервис, все возможное, чтобы установить точку входа в нужное приложение, ENV вары автоматически передается пользователю приложения. это мой Dockerfile CDM & Entrypoint запустить Apache

    ENTRYPOINT ["/usr/sbin/httpd"] CMD ["-D", "FOREGROUND"]

+1

Это не работает для 'php-fpm'; вам нужно вручную добавить переменные среды в php-fpm.conf (см. http://stackoverflow.com/questions/15428872/environment-variables-and-php) или сделать это в скрипте. – jmetz

0

Дагон правильный.

Если вы не вошли в систему как ваш веб-сервер User (apache?), Вы можете не видеть одни и те же переменные среды. Вы можете увидеть их легко с помощью тестового файла phpinfo хотя:

<?php 
phpinfo(); 
?> 

Или вы можете установить свой собственный с помощью файла .htaccess:

SetEnv HTTP_MY_VARIABLE "my value"; 

От dwitz: Вы также можете сделать переменные окружения доступны системы широкий с этим:

env | grep _ >> /etc/environment 

Извините, не могу комментировать ... Так что должен был создать ответ.

+0

phpinfo показывает те же переменные, что и print_r ($ _ENV); переменная окружения динамична каждый раз, когда я запускаю изображение докера, поэтому я не могу установить его вручную. Вы предлагаете php cant получить доступ к переменным env, поскольку он работает как пользователь apache? где моя команда оболочки env выполняется как root – dwitz

+0

Переменные среды окружения устанавливаются для пользователя, с которым вы вошли в систему. Что может отличаться от того, что будет делать php как пользователь Apache. На странице информации смотрите раздел «Переменные PHP». http://www.php.net/manual/en/reserved.variables.server.php – arikin

+0

Вы правы в доступности переменных пользователя/среды. если я выполняю 'runuser -l apache -c 'php -i'' или' runuser -l apache -c' env'' Я не вижу переменных среды, за которыми я работаю. они кажутся доступными только для root – dwitz

0

Недавно я написал библиотеку, чтобы получить значения из переменных окружения и разобрать на типы PHP данных.Эта библиотека может использоваться для синтаксического анализа переменных среды для типов данных PHP (например, для каста целых чисел, float, null, boolean), синтаксического анализа сложных структур данных, таких как строка JSON, и многое другое с вкладом commnunity.

Библиотека доступна здесь: https://github.com/jpcercal/environment

Как вы говорите, окружающая среда уже загружены. Затем, чтобы получить значения из переменной окружения (независимо от окружающей среды CLI, Apache, Nginx, PHP встроенный сервер и многое другое), чтобы сделать это:

<?php 
// ... 
require "vendor/autoload.php"; 
// ... 
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME")); 

Наслаждайтесь.

Смежные вопросы