web-dev-qa-db-ja.com

CLIとApache2Handlerの実行中にシステム環境変数をPHPに取得する方法は?

私のシステムはbuntで、/etc/environmentに環境変数を設定しました。

私が実行している場合[〜#〜] php [〜#〜][〜#〜] cli [〜#〜]を使用したスクリプト-/etc/environmentの環境変数が認識されます。

ただし、[〜#〜] php [〜#〜] script through http://domain/test.php(つまりApache2handler)を実行すると、まったく同じスクリプトがNULLを出力し、環境を意味します。 /etc/environmentの変数はロードされません。

私が行った修正は、/etc/Apache2/envvarsに変数を追加することで、問題を解決しました。

しかし、それは2つの異なるファイルであり、それらは同期を保つ必要があります。

どうすれば[〜#〜] php [〜#〜]/Apache/etc/environment(システム)から環境変数を読み込んで認識できますか?

編集:物事を明確にするために、「PHPにロードされていません」と言うと、/etc/environmentの変数が$_SERVER$_ENVgetenv()に設定されず、$GLOBALSに存在しないことを意味します。言い換えれば、「PHPにロードされていません」。

41
rock3t

私はまったく同じ問題を抱えていました。それを解決するために、/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";
?>
58
Patrick Janser

Ubuntuでは、PHPは通常のプロセスとCLIプロセスに異なるiniファイルを使用します。

/etc/php5/cli/php.ini/etc/php5/fpm/php.ini、または/etc/php5/php.iniなどのiniファイルはほとんどないはずです。関連するINIファイルを開き、

variables_order = "GPCS"

行する

variables_order = "EGPCS"

その後、$ _ ENV ['varname']を使用する前に設定した環境変数を取得します。

variables_orderに関するphp.iniから:

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.

したがって、$ _ ENV []の代わりに getenv() を使用してみてください。

1
edigu

最近、環境変数から値を取得してPHPデータ型に解析するライブラリを作成しました。このライブラリを使用して、環境変数をPHP (整数、フロート、null、booleanへのキャストなど)、JSON文字列などの複雑なデータ構造を解析し、コミュニティの貢献度を高めます。

ライブラリはこちらから入手できます。 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"));

楽しめ。

0