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

nvbavucw  于 2023-02-03  发布在  PHP
关注(0)|答案(4)|浏览(122)

我的系统是Ubuntu,我在/etc/environment中设置了环境变量。
如果我使用CLI运行PHP脚本-可以识别/etc/environment中的环境变量。
但是,如果我通过http://domain/test.php(即apache 2 handler)执行PHP脚本,则完全相同的脚本输出NULL,这意味着没有加载来自/etc/environment的环境变量。
我所做的修复是在/etc/apache2/envvars中添加变量,这解决了问题。
但这是两个不同的文件,它们必须保持同步。
如何让PHP/Apache/etc/environment(系统)加载和识别环境变量?
编辑:澄清一下,当我说'not loaded into PHP'时,它的意思是/etc/environment中的变量没有在$_SERVER$_ENVgetenv()中设置,也不存在于$GLOBALS中。

tvmytwxo

tvmytwxo1#

2014年原始回复

我遇到了完全相同的问题,为了解决这个问题,我只是在/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虚拟主机配置文件和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";
?>

更新自2020年

正如你们中的一些人所提到的,这种方法是相当古老的,不安全的,因为我们不希望Web服务器知道所有关于其他环境变量的信息,并让攻击者可以访问它们。

我的答案已经过时,显然不再有效!

主要思想是在一个地方定义一些项目常量,并在多个地方(bash脚本、Apache或Nginx conf、PHP脚本)提供这些变量。您可以有一个包含这些变量的项目文件,并且只在/etc/apache2/envvars/etc/environment中提供这个变量。

**几年来,我一直使用Ansible来部署我的项目。这样,我可以定义一些常量或变量,并将它们注入到多个配置文件中。**如果我部署到服务器集群,我还可以灵活地覆盖它们,并使用它们的变体。

dgtucam1

dgtucam12#

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

sxissh06

sxissh063#

最近我写了一个库来从环境变量中获取值并解析为PHP数据类型。这个库可以用来将环境变量解析为PHP数据类型(比如转换为整型、浮点型、空值、布尔型),解析复杂的数据结构,比如JSON字符串,以及其他一些社区的贡献。
该库可从以下位置获得:https://github.com/jpcercal/environment
将您的环境变量放入“/etc/environment”和“/etc/apache 2/envars”,重启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"));

好好享受吧。

iezvtpos

iezvtpos4#

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

SetEnv greet hello

PHP语言:

print $_SERVER["greet"];

相关问题