私のシステムは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
、$_ENV
、getenv()
に設定されず、$GLOBALS
に存在しないことを意味します。言い換えれば、「PHPにロードされていません」。
私はまったく同じ問題を抱えていました。それを解決するために、/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";
?>
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() を使用してみてください。
最近、環境変数から値を取得して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"));
楽しめ。