如何在运行 CLI 和 Apache2Handler 时将系统环境变量导入 PHP?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13568191/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to get system environment variables into PHP while running CLI & Apache2Handler?
提问by rock3t
My system is Ubuntuand I have set my environment variables in /etc/environment.
我的系统是Ubuntu,我在/etc/environment.
If I'm running PHPscript using CLI- environment variables from /etc/environmentare recognized.
如果我使用CLI运行PHP脚本-可以识别来自的环境变量。/etc/environment
But, if I go to execute PHPscript thru http://domain/test.php(that is apache2handler) exactly the same script prints out NULL, meaning environment variables from /etc/environmentare not loaded.
但是,如果我通过(即apache2handler)执行PHP脚本http://domain/test.php,则完全相同的脚本会打印出 NULL,这意味着未加载环境变量。/etc/environment
The fix I did was adding variables in /etc/apache2/envvarsand that solved the problem.
我所做的修复是在其中添加变量/etc/apache2/envvars并解决了问题。
But that is two different files, which then have to be kept in sync.
但这是两个不同的文件,然后必须保持同步。
How can I make PHP/ Apacheload and recognize environment variables from /etc/environment(system)?
如何使PHP/ Apache加载并识别来自/etc/environment(系统)的环境变量?
EDIT: To clarify things, when I say 'not loaded into PHP' it means variables from /etc/environmentare not set in $_SERVER, $_ENV, getenv()and do not exists in $GLOBALS. In other words 'are not loaded into PHP'.
编辑:为了澄清事情,当我说“未加载到 PHP”时,这意味着来自/etc/environment的变量未设置在$_SERVER, 中$_ENV,getenv()并且不存在于$GLOBALS. 换句话说,'没有加载到 PHP 中'。
回答by Patrick Janser
I had exactly the same problem. To solve it, I just sourced /etc/environmentinside /etc/apache2/envvars.
我遇到了完全相同的问题。为了解决这个问题,我只是/etc/environment在/etc/apache2/envvars.
The content of /etc/environment:
内容/etc/environment:
export MY_PROJECT_PATH=/var/www/my-project
export MY_PROJECT_ENV=production
export [email protected]
The content of /etc/apache2/envvars:
内容/etc/apache2/envvars:
# Load all the system environment variables.
. /etc/environment
Now, I'm able to use these variables in the Apache Virtual Host config files and in PHP.
现在,我可以在 Apache 虚拟主机配置文件和 PHP 中使用这些变量。
Here's an example of an Apache virtual host:
下面是一个 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>
And this is an example of how to access them with PHP:
这是如何使用 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";
?>
回答by edigu
On ubuntu, PHP uses different ini files for regular and CLI processes.
在 ubuntu 上,PHP 对常规和 CLI 进程使用不同的 ini 文件。
There should be few ini files like /etc/php5/cli/php.ini, /etc/php5/fpm/php.inior /etc/php5/php.ini. Open related INI file and change the
应该有几个 ini 文件,例如/etc/php5/cli/php.ini,/etc/php5/fpm/php.ini或/etc/php5/php.ini. 打开相关的 INI 文件并更改
variables_order = "GPCS"
variables_order = "GPCS"
line to
线到
variables_order = "EGPCS".
variables_order = "EGPCS".
After that, you would get the environment variables which you set before using $_ENV['varname'].
之后,您将获得在使用 $_ENV['varname'] 之前设置的环境变量。
From php.ini about variables_order:
从 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.
So you can try to use getenv()instead of $_ENV[].
所以你可以尝试使用getenv()而不是 $_ENV[]。
回答by Jo?o Paulo Cercal
Recently i wrote a library to get values from environment variables and parse to the PHP data types. This library can be used to parse environment variables to PHP data types (like the casting to integer, float, null, boolean), parse the complex data structures like a JSON string and more with the contribution of the commnunity.
最近我写了一个库来从环境变量中获取值并解析为 PHP 数据类型。该库可用于将环境变量解析为 PHP 数据类型(如转换为整数、浮点数、空值、布尔值),解析复杂的数据结构,如 JSON 字符串等,在社区的贡献下。
The library is available here: https://github.com/jpcercal/environment
该库可在此处获得:https: //github.com/jpcercal/environment
Put your environment variables into "/etc/environment" and "/etc/apache2/envvars", after restart your Apache Server and load your environment variables to operational system:
将环境变量放入“/etc/environment”和“/etc/apache2/envvars”,重启Apache服务器并将环境变量加载到操作系统:
# source /etc/environment
# source /etc/apache2/envvars
And to get the values from environment variable (independently of the environment CLI, Apache, Nginx, PHP Built-in Server and more) to do it:
并从环境变量(独立于环境 CLI、Apache、Nginx、PHP 内置服务器等)中获取值来执行此操作:
<?php
// ...
require "vendor/autoload.php";
// ...
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME"));
Enjoy it.
好好享受。
回答by DolDurma
i think you can only use to set an environment variable from .htaccess:
我认为您只能用于从 .htaccess 设置环境变量:
SetEnv greet hello
PHP:
PHP:
print $_SERVER["greet"];

