我已经在我的 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-fpm
和nginx
服务但是……我的环境中仍然没有任何内容。脚本返回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 池配置中对其进行硬编码。但这可能不是所有场景的最佳解决方案