如何在运行CLI& amp ;;运行CLI时将系统环境变量导入PHP Apache2Handler?

时间:2012-11-26 15:42:54

标签: php apache environment-variables

我的系统是 Ubuntu ,我已在/etc/environment中设置了我的环境变量。

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

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

我所做的修正是在/etc/environment中添加变量并解决了问题。

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

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

编辑:为了澄清事情,当我说'未加载到PHP'时,它表示/etc/environment/etc/environment$_SERVER中未设置来自$_ENV的变量在getenv()中不存在。换句话说''没有加载到PHP'。

4 个答案:

答案 0 :(得分:57)

我有完全相同的问题。为了解决这个问题,我刚刚在/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 Virtual Host配置文件和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";
?>

答案 1 :(得分:1)

在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 [&#39; varname&#39;]之前设置的环境变量。

关于variables_order的php.ini:

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

答案 2 :(得分:0)

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

图书馆可在此处找到:https://github.com/jpcercal/environment

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

# 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"));

享受它。

答案 3 :(得分:-6)

我认为你只能用来设置.htaccess:

的环境变量
SetEnv greet hello

PHP:

print $_SERVER["greet"];