如何在运行CLI和Apache2Handler时将系统环境variables导入到PHP中?

我的系统是Ubuntu ,我在/etc/environment设置了我的环境variables。

如果我使用CLI运行PHP脚本,则会识别/etc/environment中的环境variables。

但是,如果我通过http://domain/test.php (即apache2handler )执行PHP脚本,则完全相同的脚本会输出NULL,这意味着不会加载/etc/environment中的环境variables。

我所做的修复是在/etc/apache2/envvars添加variables,并解决了这个问题。

但这是两个不同的文件,然后必须保持同步。

我如何使PHP / Apache加载并从/etc/environment (system)中识别环境variables?

编辑:澄清的事情,当我说'没有加载到PHP'这意味着variables从/etc/environment没有设置$_SERVER$_ENVgetenv()并不存在$GLOBALS 。 换句话说,“不加载到PHP”。

我有完全一样的问题。 为了解决这个问题,我只是在/etc/apache2/envvars /etc/environment

/etc/environment的内容:

 export MY_PROJECT_PATH=/var/www/my-project export MY_PROJECT_ENV=production export MY_PROJECT_MAIL=support@my-project.com 

/etc/apache2/envvars

 # Load all the system environment variables. . /etc/environment 

现在,我可以在Apache虚拟主机configuration文件和PHP中使用这些variables。

以下是一个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"; ?> 

在Ubuntu上,PHP为常规和CLI进程使用不同的ini文件。

应该有一些ini文件,如/etc/php5/fpm/php.ini/etc/php5/php.ini 。 打开相关的INI文件并更改

variables_order = "GPCS"

行到

variables_order = "EGPCS"

之后,您将获得使用$ _ENV ['varname']之前设置的环境variables。

从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. 

所以你可以尝试使用getenv()而不是$ _ENV []。

最近我写了一个库来从环境variables中获取值并parsing为PHP数据types。 这个库可以用来parsingPHP数据types的环境variables(比如转换为整型,浮点型,空值,布尔型),像JSONstring一样parsing复杂的数据结构,以及通信的贡献。

该库可在这里: https : //github.com/jpcercal/environment

把你的环境variables放到“/ etc / environment”和“/ etc / apache2 / envvars”中,重启你的Apache服务器并把你的环境variables加载到操作系统中:

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

要从环境variables(独立于环境CLI,Apache,Nginx,PHP内置服务器等)获取值,请执行以下操作:

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

好好享受。

我想你只能用.htaccess设置一个环境variables:

 SetEnv mohammad hello 

PHP:

 print $_SERVER["mohammad"];