前言

关于如何读取和配置PHP的$_ENV变量,网上已经有很好的总结,一如:

PHP增加$_ENV变量

但是,对于在Ubuntu下的配置,会有一些差异。对于初学者,如果不明白其中的区别,很容易会困惑,甚至花费了大量的时间还是没能解决正确读取$_ENV这一问题。这里,简单备忘一下,如何在Ubuntu系统上,对于PHP5.6,怎样在cli命令行模式和PHP-fpm模式下读取和配置$_ENV。

本次的环境为:

  • Ubuntu 16.04.2 LTS
  • PHP 5.6.30-11+deb.sury.org~xenial+3

PHP-fpm的配置与读取

1、首先,要开启$_ENV

把/etc/PHP/5.6/fpm/PHP.ini配置文件原来的:

variables_order = "GPCS"

改成(在前面追加E,表示$_ENV变量):

variables_order = "EGPCS"

对于重启PHP-fpm,可以有两种方式,一种是使用service,没有错误提示即表明重启成功。如:

# service PHP5.6-fpm restart

另一种是直接使用PHP5.6-fpm的脚本,重启成功后,可以看到相应的提示。如:

# /etc/init.d/PHP5.6-fpm restart
[ ok ] Restarting PHP5.6-fpm (via systemctl): PHP5.6-fpm.service.

2、配置$_ENV变量

接下来,这一步比较关键。很多文章都是说在 PHP-fpm.conf 文件中添加$_ENV的变量,如在/etc/PHP/5.6/fpm/PHP-fpm.conf配置文件中添加:

env[DOGSTAR]=$DOGSTAR

然后,重启PHP-fpm,结果不但配置没生效,而且连PHP-fpm都重启失败了。错误提示如下:

# /etc/init.d/PHP5.6-fpm restart
[....] Restarting PHP5.6-fpm (via systemctl): PHP5.6-fpm.serviceJob for PHP5.6-fpm.service Failed because the control process exited with error code. See "systemctl status PHP5.6-fpm.service" and "journalctl -xe" for details.
 Failed!

把刚才添加的配置去掉后,就能恢复正常了。

曾经一度,我被困在这个环节,也花了很多时间去解决。最后,经排查,在/etc/PHP/5.6/fpm/PHP-fpm.conf配置文件中有这么一行配置,即表示它还引用了pool.d目录下的配置文件。

include=/etc/PHP/5.6/fpm/pool.d/*.conf

再看一下,会发现pool.d目录下只有一个配置文件,即:/etc/PHP/5.6/fpm/pool.d/www.conf,打开它,会发现有这样的配置内容:

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

虽然被注释了,但我们找到了配置$_ENV的正确位置!随后,在这后面添加我们需要添加的配置,如直接配置:

env[DOGSTAR]=dogstar

也可以配置系统变量,再通过系统变量去读取,如:

env[DOGSTAR]=dogstar
env[MY_REdis_HOST]=$MY_REdis_HOST

系统变量以“$”开头,这时,需要在/etc/profile文件添加相应的变量:

export MY_REdis_HOST="localhost"

source后,正常情况下能看到刚设置的系统变量。

# source /etc/profile && echo $MY_REdis_HOST
localhost

添加配置后,为了方便PHP-fpm在每次重启时自动载入系统变量,可以在/etc/init.d/PHP5.6-fpm脚本中,加上:

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# 新增一行,自动载入系统配置
. /etc/profile

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

最后,记得要重启一下PHP-fpm。

3、通过PHP-fpm读取$_ENV

最后,可以编写一个文件./index.PHP,放置读取$_ENV的代码,测试一下效果,如:

<?PHP
var_dump(getenv('DOGSTAR'),$_ENV['DOGSTAR']);
var_dump(getenv('MY_REdis_HOST'),$_ENV['MY_REdis_HOST']);

正常情况下,可以看到:

string 'dogstar' (length=7)

string 'dogstar' (length=7)

string '' (length=0)

string '' (length=0)

PHP-fpm读取不到环境变量?

如果PHP-fpm读取不到系统环境变量,怎么办?如下图,显示为“no value”。

但运行PHP-fpm的用户的确已经可以正常读取到环境变量,如:

su -s /bin/bash -c "echo $MY_REdis_HOST" www-data
localhost

排查清单:

  • 确保配置为: clear_env = no ,参考:Environment variables and PHP
  • 确保sudo下PHP有权限读取环境变量,参考:php获取环境变量

2、通过fpm配置传递 fpm在每次启动时都会读取PHP-fpm.conf文件中的环境变量设置,如: env[ENV_XXX]="test test" 或者让fpm读取系统环境变量,如: env[ENV_XXX]=$ENV_XXX 注意此种方式要确保系统环境变量存在,且不被sudo禁用。 如果fpm是用sudo方式启动,默认sudo会禁用一些环境变量,可以通过以下方式放开限制: vim /etc/sudoers Defaults env_reset Defaults env_keep = "ENV_XXX" 或者干脆放开所有限制: Defaults !env_reset

  • 确保 env[PATH] 已开启并添加所需要的值,参考:No environment variables are available via PHP-fpm+nginx

Summary is: Locate your www.conf file in your PHP5-fpm config folder (for Ubuntu this is /etc/PHP5/fpm/pool.d/www.conf) and uncomment the needed env[PATH] line.

Optionally update the content of the variable with the output of PHP -r "echo getenv('PATH');"

// Todo (这里花费了大量的时间,但仍未得解)

第二部分:cli的配置与读取

1、开启cli模式下的$_ENV

# PHP --ini
Configuration File (PHP.ini) Path: /etc/PHP/5.6/cli
Loaded Configuration File:         /etc/PHP/5.6/cli/PHP.ini

如果不知道用的是哪个ini配置文件,可以用 PHP --ini 查看,如上面所示,通常情况下用的都是 /etc/PHP/5.6/cli/PHP.ini 配置文件。打开此文件,然后把里面的:

variables_order = "GPCS"

同样,改成(在前面追加E,表示$_ENV变量):

variables_order = "EGPCS"

2、配置cli下的$_ENV

开启了cli下的$_ENV后,那它的配置存放在哪呢?之前没留意看stackoverflow上的英文内容,走了不少弯路。如在:

How to get system environment variables into PHP while running CLI & Apache2Handler?

上面有这样的一段话:

My system isUbuntuand I have set my environment variables in/etc/environment.

If I'm runningPHPscript usingCLI- environment variables from/etc/environmentare recognized.

这表明,cli下的$_ENV配置是存在 /etc/environment 里!为了区分与PHP-fpm的配置,在这个文件里添加:

export MY_REdis_HOST=$MY_REdis_HOST
export DOGSTAR="dogstar_from_enviroment"

3、cli下读取$_ENV配置

配置好后,不需要重启PHP,通过getenv()或者$_ENV即可读取相应的配置。如前面的index.PHP文件,执行效果如下:

$ PHP ./index.PHP 
string(23) "dogstar_from_enviroment"
string(23) "dogstar_from_enviroment"
string(9) "localhost"
string(9) "localhost"

如果读取不到,可以先source一下。

$ source /etc/environment

小结

对于PHP-fpm模式,

  • 配置开关variables_order = "EGPCS" 在 /etc/PHP/5.6/fpm/PHP.ini 配置文件中设置(如果不知是哪个文件,可通过 ps -ef | grep PHP,或PHPinfo() 查看)
  • env的配置保存在 /etc/PHP/5.6/fpm/PHP-fpm.conf 文件
  • 配置后需要重启PHP-fpm

对于PHP cli模式,

  • 配置开关 variables_order = "EGPCS" 在 /etc/PHP/5.6/cli/PHP.ini 配置文件中设置(如果不知是哪个文件,可以使用 PHP --ini 查看)
  • env的配置保存在 /etc/environment 文件
  • 配置后,需要 source /etc/environment,不需要重启PHP-fpm

【完整手记】Ubuntu+PHP5.6+cli+php-fpm下如何读取和配置$_ENV的更多相关文章

  1. iOS – 友好的NSDate格式

    我需要在我的应用程序中显示帖子的日期给用户,现在我用这种格式:“5月25日星期五”.如何格式化NSDate以阅读“2小时前”的内容?使其更加用户友好.解决方法NSDateFormatter不能做这样的事情;你将需要建立自己的规则.我想像:所以这是打印’x分钟前’或’x小时前’从日期起24小时,通常是一天.

  2. ios – 存档期间不存在Xcode环境变量

    我有一个具有TestFlight构建方案的iOS应用程序.在此方案中,我在“运行”选项卡中设置了一个称为TESTFLIGHT的环境变量,值为1.此外,在构建方案的“配置文件”选项卡中,它已选中“使用RUn操作的参数和变量”选项,并在列表中看到相应的EV.当从Xcode运行应用程序时,这可以正常工作,但是当我在存储设备上运行应用程序时,环境变量TESTFLIGHT不存在.我的问题是有一个我在这里缺少的选项/方案选项卡?

  3. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  4. 记一次云计算测试实验-openstack-icehouse-安装swift

    -----------------------controller:---------------------------------sourceadmin-openrc.shkeystoneuser-create--name=swift--pass=000000--email=swift@localhostkeystoneuser-role-add--user=swift--tenant=ser

  5. swift学习2 元组 tuples

    swift中出现了一种新的数据结构,非常牛掰的元组tuples如果懂PHP的猿,会发现这个元组和PHP的数组非常类似,同样是可以默认不指定key,也可以指定key目前的学习疑问是,如何进行元组的遍历?

  6. Ubantu下配置swift开发环境

    恭喜.现在可以直接在这里写入临时的swift代码,注意是临时的.如果想要写swift,需要新建一个文件,比如touchhello.swift.用vim打开,在里面写入HelloWorld的代码,保存退出.编译上面的代码源文件,打开终端,找到源代码所在目录,输入命令swiftchello.swift,即可编译,如果没有出现错误,则说明编译成功.运行上面的hello,编译之后会出现一个新文件hello;这是ubantu的可执行文件,直接输入./hello即可执行

  7. 尝试使用swift mailer,gmail smtp,php发送邮件

    这里是我的代码:在运行时出现此错误…

  8. android – 错误:程序“/ndk-build.cmd”在PATH中找不到

    按钮在出现的框中,选择名称字段并键入NDKROOT.在您解压缩AndroidNDK的路径中的值类型的字段中.点击“应用”,完成,对依赖NDK的任何其他项目进行此操作.

  9. android – 模拟器中hosts文件中的Url映射被忽略

    我正在使用genymotion仿真器,并使用它从主机文件中提取adbremountadbpull/system/etc/hostsC:\Users\Rkn09\Desktop\hosts我添加了新的映射192.168.0.115xxx.mydomain.com,我把它推回到模拟器使用adbpushC:\Users\Rkn09\Desktop\hosts/system/etc/hosts但是当我向x

  10. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

随机推荐

  1. crontab发送一个月份的电子邮件

    ubuntu14.04邮件服务器:Postfixroot收到来自crontab的十几封电子邮件.这些邮件包含PHP警告.>我已经解决了这些警告的原因.>我已修复每个cronjobs不发送电子邮件(输出发送到>/dev/null2>&1)>我删除了之前的所有电子邮件/var/mail/root/var/spool/mail/root但我仍然每小时收到十几封电子邮件.这些电子邮件来自cronjobs,

  2. 模拟两个ubuntu服务器计算机之间的慢速连接

    我想模拟以下场景:假设我有4台ubuntu服务器机器A,B,C和D.我想在机器A和机器C之间减少20%的网络带宽,在A和B之间减少10%.使用网络模拟/限制工具来做到这一点?

  3. ubuntu-12.04 – 如何在ubuntu 12.04中卸载从源安装的redis?

    我从源代码在Ubuntu12.04上安装了redis-server.但在某些时候它无法完全安装,最后一次makeinstallcmd失败.然后我刚刚通过apt包安装.现在我很困惑哪个安装正在运行哪个conf文件?实际上我想卸载/删除通过源安装的所有内容,只是想安装一个包.转到源代码树并尝试以下命令:如果这不起作用,您可以列出软件自行安装所需的步骤:

  4. ubuntu – “apt-get source”无法找到包但“apt-get install”和“apt-get cache”可以找到它

    我正在尝试下载软件包的源代码,但是当我运行时它无法找到.但是当我运行apt-cache搜索squid3时,它会找到它.它也适用于apt-getinstallsquid3.我使用的是Ubuntu11.04服务器,这是我的/etc/apt/sources.list我已经多次更新了.我尝试了很多不同的debs,并没有发现任何其他地方的错误.这里的问题是你的二进制包(deb)与你的源包(deb-src)不

  5. ubuntu – 有没有办法检测nginx何时完成正常关闭?

    &&touchrestarted),因为即使Nginx没有完成其关闭,touch命令也会立即执行.有没有好办法呢?这样的事情怎么样?因此,pgrep将查找任何Nginx进程,而while循环将让它坐在那里直到它们全部消失.你可以改变一些有用的东西,比如睡1;/etc/init.d/Nginx停止,以便它会休眠一秒钟,然后尝试使用init.d脚本停止Nginx.你也可以在某处放置一个计数器,这样你就可以在需要太长时间时发出轰击信号.

  6. ubuntu – 如何将所有外发电子邮件从postfix重定向到单个地址进行测试

    我正在为基于Web的应用程序设置测试服务器,该应用程序发送一些电子邮件通知.有时候测试是使用真实的客户数据进行的,因此我需要保证服务器在我们测试时无法向真实客户发送电子邮件.我想要的是配置postfix,以便它接收任何外发电子邮件并将其重定向到一个电子邮件地址,而不是传递到真正的目的地.我正在运行ubuntu服务器9.10.先感谢您设置本地用户以接收所有被困邮件:你需要在main.cf中添加:然后

  7. ubuntu – vagrant无法连接到虚拟框

    当我使用基本的Vagrantfile,只配置了两条线:我看到我的虚拟框打开,但是我的流氓日志多次显示此行直到超时:然后,超时后的一段时间,虚拟框框终于要求我登录,但是太久了!所以我用流氓/流氓记录.然后在我的物理机器上,如果我“流氓ssh”.没有事情发生,直到:怎么了?

  8. ubuntu – Nginx – 转发HTTP AUTH – 用户?

    我和Nginx和Jenkins有些麻烦.我尝试使用Nginx作为Jenkins实例的反向代理,使用HTTP基本身份验证.它到目前为止工作,但我不知道如何传递带有AUTH用户名的标头?}尝试将此指令添加到您的位置块

  9. Debian / Ubuntu – 删除后如何恢复/ var / cache / apt结构?

    我在ubuntu服务器上的空间不足,所以我做了这个命令以节省空间但是现在在尝试使用apt时,我会收到以下错误:等等显然我删除了一些目录结构.有没有办法做apt-getrebuild-var-tree或类似的?

  10. 检查ubuntu上安装的rubygems版本?

    如何查看我的ubuntu盒子上安装的rubygems版本?只是一个想法,列出已安装的软件包和grep为ruby或宝石或其他:)dpkg–get-selections

返回
顶部