2012-11-26 14 views
35

私のシステムはです。Ubuntuと私は/etc/environmentに自分の環境変数を設定しました。CLI&Apache2Handlerの実行中にシステム環境変数をPHPに取得する方法は?

私はCLIを使用してPHPスクリプトを実行している場合 - /etc/environmentから環境変数が認識されています。

しかし、私は(それは、apache2handlerです)http://domain/test.phpスルーPHPスクリプトを実行するために行けば、まったく同じスクリプトが/etc/environmentから環境変数がロードされていないという意味、NULLを出力します。

私が行った修正は、/etc/apache2/envvarsに変数を追加していて、問題を解決しました。

しかし、これは2つの異なるファイルであり、これらのファイルは同期していなければなりません。

にはどうすればPHP/Apacheの負荷を行い、/etc/environment(システム)からの環境変数を認識することができますか?

編集:私はそれが/etc/environmentからの変数は、$_SERVERに設定$_ENVgetenv()$GLOBALSに存在していないされていない意味のPHPにロードされていない "と言ったときに、物事を明確にします。言い換えれば、 'PHPに読み込まれません'。

答えて

46

私は全く同じ問題を抱えていました。それを解決するために、私は/etc/apache2/envvarsの中に/etc/environmentを供給しました。

/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のバーチャルホストの設定ファイルにし、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"; 
?> 
+0

私の場合、/ etc/environmentでは、各変数宣言を2行に分けなければなりませんでした。 'VAR =" myVar "'それ以外の場合は動作しません – cafonso

+0

これは私にとってはうまくいったが、 '/ etc/profiles.d/myproject.sh'(Ubuntu Raringで)を使った。 – willoller

+1

私の(Ubuntu 16.04LTS)システムでは、次のように/ etc/environmentにエクスポートステートメントを組み込む必要がありました: 'export MY_VAR = 'foo'' –

-5

は、私はあなたが唯一の.htaccessから環境変数を設定するために使用することができると思う:

SetEnv mohammad hello 

PHP:Ubuntuで

print $_SERVER["mohammad"]; 
+0

質問を読んだことがありますか? OPはenv変数を設定する方法を知っています。 –

1

、PHPは、定期的かつCLIプロセスに異なるのiniファイルを使用しています。

/etc/php5/cli/php.ini,/etc/php5/fpm/php.iniまたは/etc/php5/php.iniのようなiniファイルはほとんどありません。関連のINIファイルを開き、

variables_order = "EGPCS"

variables_order = "GPCS"

行を変更します。

その後、$ _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. 

ですから、$ _ENV []の代わりにgetenv()を使用しようとすることができます。

+1

私はUbuntu上で2つの異なるphp.iniファイルを認識しています。そして彼らはどちらも可変注文を 'GPCS'に設定しています。 'E'を追加することは私をここで助けてくれません...システム(ubuntu)envvarsが$ _ENVになく、PHPには全くロードされていないので、スーパーグローバルのリストではないことを意味し、$ GLOBALS、$ _SERVER、$ _ENVも含まれていません。 100%確実になるために、「E」を付けて確認します。 – rock3t

+0

期待どおり:/ etc /環境変数はSAPIをapache2handlerとして使用している間はPHPグローバルにロードされません。 – rock3t

+0

私は 'php -i'を使ってどの' php.ini'ファイルが読み込まれているかを調べました。 'variables_order'を変更しても動作しません。 'php -i'は' GPCS'を報告します。 – mzedeler

0

最近、私は環境から値を取得するためのライブラリを書きました変数とPHPのデータ型を解析します。このライブラリを使用して、環境変数をPHPデータ型(integer、float、null、booleanへのキャストなど)に解析し、JSON文字列などの複雑なデータ構造を解析し、共同体の貢献度をさらに高めることができます。

ライブラリがここにあります:https://github.com/jpcercal/environment

の「/ etc /環境」にあなたの環境変数を入れての「/ etc/apache2の/ envvarsが」、後にあなたのApacheサーバを再起動し、運用システムに環境変数をロードします。

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

と環境変数の値(独立した環境のCLIは、Apache、Nginxは、PHPがビルトインServerおよびそれ以上)にそれを行うために取得する:

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

お楽しみください。

関連する問題