使用 Nginx 在 PHP-FPM 中获取环境变量

使用 Nginx 在 PHP-FPM 中获取环境变量

我已经在我的 ArchLinux 上定义了一些环境变量,就像APP_ENV在我的/etc/environment文件中一样。

如果我输入printenv,我就会看到它们。

我创建了这个简单的测试文件,名为……test.php

<?php

var_dump(getenv('APP_ENV'));
var_dump(getenv());

如果我运行php test.php,一切正常,我会看到我的 ENV 变量。

但是当我尝试通过 HTTP 访问该文件时...我的环境中什么都没有!

当然,我已经将配置/etc/php/php-fpm.d/www.conf改为clear_env = no

以下是受影响的线路:

; Clear environment in FPM workers
; Prevents arbitrary environment variables from reaching FPM worker processes
; by clearing the environment in workers before env vars specified in this
; pool configuration are added.
; Setting to "no" will make all environment variables available to PHP code
; via getenv(), $_ENV and $_SERVER.
; Default Value: yes
clear_env = no

我已经重新启动了php-fpmnginx服务但是……我的环境中仍然没有任何内容。脚本返回bool(false)

那么...我遗漏了什么吗?

这是我的 php-fpm 版本:

php-fpm --version
PHP 7.2.6 (fpm-fcgi) (built: May 26 2018 07:45:18)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

我的 Nginx 版本

nginx -v
nginx version: nginx/1.14.0

我应该怎么做才能在 PHP-FPM 上下文中访问我的环境变量?

多谢!

答案1

您可以像这样在 /etc/php/php-fpm.d/www.conf 中设置环境变量: env[APP_ENV] = development 然后您就可以getenv('APP_ENV')像预期的那样获得它。

答案2

当您输入 printenv 或 php test.php 时,您会看到环境变量,因为它们存在。

当你“尝试通过 HTTP 访问文件…你的环境中没有任何内容”时。确切地说,你的环境变量没有设置。

为什么你会期望不同的行为?/etc/environment、/etc/profile 和 /etc/bashrc 等文件仅在使用 shell 时才会被获取,而不是在运行守护进程时。

答案3

一种可能的解决方法是创建一个 php 文件,例如

<? $_SERVER['APP_ENV]='dev';

磁盘上的某个位置,并通过 php.ini 设置将其包含在内auto_prepend_file。不太干净,但它可能有助于避免在 php-fpm 配置中存储机密信息...

理由:

似乎 fpm 配置的 php 文档没有清楚地说明如何clear_env以及env应该如何在池配置文件中工作。

根据我的经验:

  • 何时向工作人员提供的环境变量clear_env = no是池中定义的用户的环境变量,通常不是 root 用户
  • 在 .bashrc 等位置为该用户定义环境变量将不起作用,因为工作进程不会像 shell 一样读取相同的环境配置脚本
  • 似乎,根据 php-fpm 的实际启动方式(通过 init.d 脚本 / systemd / 通过 fe 自定义 Docker CMD 直接调用可执行文件),环境变量可能会出现,也可能不会出现

更糟糕的是,很难让文档中的语法env[APP_ENV] = $APP_ENV发挥作用,所以让值显示出来的唯一方法是在 fpm 池配置中对其进行硬编码。但这可能不是所有场景的最佳解决方案

相关内容