通过虚拟主机配置设置Application_ENV并在PHP中读取

52

我喜欢Zend Framework中的这个功能。我可以通过检查我的控制器中的APPLICATION_ENV常量来知道当前正在使用哪个环境。

<VirtualHost *:80>
    #ServerName 
    #DocumentRoot

        SetEnv APPLICATION_ENV "development"

    # Directory
</VirtualHost>

但不幸的是,我不能在当前的项目中使用ZF。如何在我的PHP代码中检查这个环境变量?

4个回答

49
由于SetEnv将值设置为Apache的环境变量,您可以使用以下方法获取它: 或者只需使用以下方法:
  • getenv — 获取环境变量的值

如果你查看ZF项目中的public/index.php文件,你会看到ZF使用了getenv函数。
// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? 
                                  getenv('APPLICATION_ENV') : 
                                  'production'));

一个常用的替代方法是从PHP中读取主机名,并相应地定义常量。
if(!defined('APPLICATION_ENV')) {
    if(FALSE === stripos($_SERVER['SERVER_NAME'], 'www.yourdomain.com')) {
        define(APPLICATION_ENV, 'development');
    } else {
        define(APPLICATION_ENV, 'production');
    }
}

这样,你完全不需要依赖环境设置。

3
需要注意的一点是,对于仍在阅读此答案的人:使用备用方法仅适用于通过url执行的脚本,命令行脚本(例如cron)将不知道$_SERVER ['SERVER_NAME']是什么,因此将默认为“production”。请使用虚拟主机设置以确保正确。 - Zak Henry
我需要在这里激活什么?任何特殊的模块吗?我尝试在父目录__ .htaccess__文件和__site-enable__文件中使用SetEnv,但getenv仍然会给我bool(false)。与其他正常工作的服务器相比,我找不到任何区别。 - yellowsir
@yellowsir,请检查Web服务器是否允许每个目录使用htaccess,并确保在全局配置中设置后重新启动Apache。 - Gordon
@gordon 谢谢您的回复,我已经尝试过两种方式。 第一种方法是通过启用AllowOverride来实现的,代码如下: [...] SetEnv APPLICATION_ENV production DocumentRoot /var/www [...] - yellowsir

14

SetEnv 定义了一个环境变量。

一旦设置了这个变量 (无论是在您的Apache配置中还是在系统级别),您可以使用 getenv 函数来读取它的值:

echo getenv('APPLICATION_ENV');

例如,如果您在您的`.htaccess`文件中使用这个:
SetEnv TEST glop

你可以使用以下这段PHP代码:
var_dump(getenv('TEST'));

你会得到:
string 'glop' (length=4)

2

您也可以通过$_SERVER变量访问它。


1
为了帮助 OP 解决当前的问题,可以在回答中添加一些解释说明。 - ρяσѕρєя K

0

我曾经遇到过同样的问题,但是我解决了它。解决这个问题的方法是在 Apache 的 init 脚本中声明所有变量。

我在 CentOS 上使用 Apache,init 脚本位于 /etc/init.d/httpd

添加以下代码,但请根据您的具体情况进行更改。

ORACLE_HOSTNAME=ora11g.home.com; export ORACLE_HOSTNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1; export ORACLE_HOME
ORACLE_SID=ora11g; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH; export PATH
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib;
export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib;
export CLASSPATH

这解决了我的问题。希望对你有所帮助。


我不明白。Apache httpd 中没有“导出”指令。另外,你如何访问刚刚在 PHP 中设置的其他变量?也许你没有理解问题,或者我漏掉了什么。 - David Spector
它初始化脚本。/etc/init.d/httpd是一个Bash shell脚本。 - Firman Syah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接