Подтвердить что ты не робот

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

Моя система Ubuntu, и я установил переменные среды в /etc/environment.

Если я использую PHP script, используя CLI, будут распознаны переменные среды из /etc/environment.

Но если я перейду к выполнению PHP script thru http://domain/test.php (то есть apache2handler), то точно такой же script выводит NULL, что означает переменные среды из /etc/environment не загружаются.

Исправление, которое я делал, заключалось в добавлении переменных в /etc/apache2/envvars, и это решило проблему.

Но это два разных файла, которые затем нужно синхронизировать.

Как я могу сделать PHP/ Apache загружать и распознавать переменные среды из /etc/environment (system)?

EDIT: Чтобы прояснить ситуацию, когда я говорю "не загружен в PHP", это означает, что переменные из /etc/environment не установлены в $_SERVER, $_ENV, getenv() и не существуют в $GLOBALS. Другими словами, "не загружаются в PHP".

4b9b3361

Ответ 1

У меня была точно такая же проблема. Чтобы решить эту проблему, я только что получил /etc/environment внутри /etc/apache2/envvars.

Содержимое /etc/environment:

export MY_PROJECT_PATH=/var/www/my-project
export MY_PROJECT_ENV=production
export [email protected]

Содержимое /etc/apache2/envvars:

# Load all the system environment variables.
. /etc/environment

Теперь я могу использовать эти переменные в конфигурационных файлах Apache Virtual Host и на PHP.

Вот пример виртуального хоста Apache:

<VirtualHost *:80>
  ServerName my-project.com
  ServerAlias www.my-project.com
  ServerAdmin ${MY_PROJECT_MAIL}
  UseCanonicalName On

  DocumentRoot ${MY_PROJECT_PATH}/www

  # Error log.
  ErrorLog ${APACHE_LOG_DIR}/my-project.com_error.log
  LogLevel warn

  # Access log.
  <IfModule log_config_module>
    LogFormat "%h %l %u %t \"%m %>U%q\" %>s %b %D" clean_url_log_format
    CustomLog ${APACHE_LOG_DIR}/my-project.com_access.log clean_url_log_format
  </IfModule>

  # DocumentRoot directory
  <Directory ${MY_PROJECT_PATH}/www>
    # Disable .htaccess rules completely, for better performance.
    AllowOverride None
    Options FollowSymLinks Includes
    Order deny,allow
    Allow from All

    Include ${MY_PROJECT_PATH}/config/apache/inc.mime-types.conf
    Include ${MY_PROJECT_PATH}/config/apache/inc.cache-control.conf

    # Rewrite rules.
    <IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteBase /

      # Include all the common rewrite rules (for http and https).
      Include ${MY_PROJECT_PATH}/config/apache/inc.rewriterules-shared.conf
    </IfModule>
  </Directory>
</VirtualHost>

И это пример того, как обращаться к ним с PHP:

<?php
header('Content-Type: text/plain; charset=utf-8');
print getenv('MY_PROJECT_PATH') . "\n" .
      getenv('MY_PROJECT_ENV') . "\n" .
      getenv('MY_PROJECT_MAIL') . "\n";
?>

Ответ 2

В ubuntu PHP использует разные ini файлы для обычных и CLI-процессов.

Там должно быть мало файлов ini, таких как /etc/php5/cli/php.ini, /etc/php5/fpm/php.ini или /etc/php5/php.ini. Откройте соответствующий INI файл и измените

variables_order = "GPCS"

строка

variables_order = "EGPCS".

После этого вы получите переменные окружения, которые вы задали перед использованием $_ENV ['varname'].

От php.ini около variables_order:

Abbreviations for the following respective super globals: GET, POST, COOKIE,
ENV and SERVER. There is a performance penalty paid for the registration of
these arrays and because ENV is not as commonly used as the others, ENV is
is not recommended on productions servers. You can still get access to
the environment variables through getenv() should you need to.

Итак, вы можете попытаться использовать getenv() вместо $_ENV [].

Ответ 3

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

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

Поместите переменные среды в "/etc/environment" и "/etc/apache2/envvars", после перезапуска сервера Apache и загрузите переменные среды в операционную систему:

# source /etc/environment
# source /etc/apache2/envvars

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

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

Наслаждайтесь этим.

Ответ 4

Я думаю, вы можете использовать только для установки переменной среды из .htaccess:

SetEnv mohammad hello

PHP:

print $_SERVER["mohammad"];