web-dev-qa-db-ja.com

環境変数とPHP

ubuntuコミュニティの推奨事項に従って、少数のカスタム環境変数が/ etc/environmentに設定されたubuntuサーバーがあります

コマンドラインからphpを使用する場合、phpのgetenv()関数を使用してこの変数にアクセスできます。

また、コマンドラインからphpinfo()を実行すると、ENVIRONMENTセクションにすべての変数が表示されます。

ただし、php5-fpmによって実行されているプロセス内の同じデータにアクセスしようとすると、このデータは利用できません。 phpinfo()のENVIRONMENTセクションで確認できるのは次のとおりです。

USER    www-data
HOME    /var/www

コマンドラインがこのiniを使用していることを知っています。

/etc/php5/cli/php.ini

そしてfpmは以下を使用します:

/etc/php5/fpm/php.ini

ENV変数が両方で発生しない理由を説明する2つの違いを見つけることができませんでした。

また実行した場合:

Sudo su www-data

そして、環境変数がエコーされ、www-dataユーザーが実際に使用できると期待しています。

環境変数をfpmで実行されるphpプロセスに取り込むには何が必要ですか?

18
sungiant

Php-fpm.confでENV変数を明示的に設定する必要があることがわかります

次に例を示します。

[global]
pid = /var/run/php5-fpm.pid
error_log = /var/log/php5-fpm.log

[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
env[MY_ENV_VAR_1] = 'value1'
env[MY_ENV_VAR_2] = 'value2'
23
sungiant

1。 php-fpm.confで環境変数を自動的に設定する

clear_env = no


2。 php-fpm.confで環境変数を手動で設定する

env[MY_ENV_VAR_1] = 'value1'
env[MY_ENV_VAR_2] = 'value2'


!どちらの方法もphp-fpm.conf:で説明されています

FPMワーカーの環境をクリアするこのプール構成で指定されたenv変数が追加される前にワーカーの環境をクリアすることにより、任意の環境変数がFPMワーカープロセスに到達しないようにします。 「no」に設定すると、すべての環境変数がPHP getenv()、$ _ ENV、および$ _SERVERを介したコード)で使用できるようになります。デフォルト値:yes

clear_env = no


LD_LIBRARY_PATHなどの環境変数を渡します。すべての$ VARIABLEは現在の環境から取得されます。デフォルト値:clean env

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp


これで解決策が見つかりました githubディスカッション

13
Andrej Kouril

問題は、php-fpmを実行するときです。プロセスは環境をロードしません。
起動スクリプトにロードできます。
私のphp-fpmはapt-getによってインストールされます。
したがって、

/etc/init.d/php5-fpm

追加します(ドットとスラッシュの間のスペースに注意してください)

。/etc/profile

/ etc/profileを変更して追加します

。 /home/user/env.sh

Env.sh内。必要に応じて環境をexportできます。

次に変更します

php-fpm.conf

追加 env[MY_ENV_VAR_1] = 'value1'[www] セクション。
最終。 php-fpmを再起動します。 fpmによって環境負荷を取得します。

1
Magic

上記の回答に加えて、php-fpm7 DockerコンテナでAlpine:3.8およびnginxを実行していました。私が直面した問題は、USER myuserの環境変数がUSER rootにコピーされないことでした。

Dockerのエントリポイントは

Sudo nginx  # Runs nginx as daemon
Sudo php-fpm7 -F -O  # Runs php-fpm7 in foreground

これに対する解決策は

Sudo -E nginx
Sudo -E php-fpm7 -F -O

Sudoの-Eオプションは、現在のユーザーのすべての環境変数をルートにコピーします

もちろん、php-fpm.d/www.confファイルにはclear_env=noが必要です

参考までに、supervisordのようなデーモンサービスを使用している場合、環境をコピーするための独自の設定があります。たとえば、supervisordにはcopy_env=Trueという設定があります

0
theBuzzyCoder