47

我的系统是Ubuntu,我已将环境变量设置为/etc/environment.

如果我使用CLI运行PHP脚本-可以识别来自的环境变量。/etc/environment

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

我所做的修复是在其中添加变量/etc/apache2/envvars并解决了问题。

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

如何使PHP / Apache/etc/environment从(系统)加载和识别环境变量?

编辑:为了澄清事情,当我说“未加载到 PHP 中”时,它意味着来自的变量/etc/environment未设置在$_SERVER,中$_ENVgetenv()并且不存在于$GLOBALS. 换句话说,“没有加载到 PHP 中”。

4

4 回答 4

63

我有完全相同的问题。/etc/environment为了解决它,我只是在内部采购/etc/apache2/envvars

的内容/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 虚拟主机配置文件和 PHP 中使用这些变量。

以下是 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";
?>
于 2014-05-13T15:09:34.493 回答
3

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

应该有几个 ini 文件,如/etc/php5/cli/php.ini,/etc/php5/fpm/php.ini/etc/php5/php.ini. 打开相关的INI文件,修改

variables_order = "GPCS"

线到

variables_order = "EGPCS".

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

从 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[]。

于 2012-11-26T16:24:19.273 回答
1

最近我写了一个库来从环境变量中获取值并解析为 PHP 数据类型。该库可用于将环境变量解析为 PHP 数据类型(如转换为整数、浮点数、空值、布尔值),解析 JSON 字符串等复杂数据结构,以及更多社区的贡献。

该库可在此处获得:https ://github.com/jpcercal/environment

重新启动 Apache 服务器并将环境变量加载到操作系统后,将环境变量放入“/etc/environment”和“/etc/apache2/envvars”:

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

并从环境变量(独立于环境 CLI、Apache、Nginx、PHP 内置服务器等)中获取值来执行此操作:

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

好好享受。

于 2015-11-04T20:19:07.660 回答
-6

我认为您只能用于从 .htaccess 设置环境变量:

SetEnv greet hello

PHP:

print $_SERVER["greet"];
于 2012-11-26T16:02:53.420 回答