通过虚拟主机配置设置应用程序_ENV并在PHP中读取

通过虚拟主机配置设置应用程序_ENV并在PHP中读取,php,apache,zend-framework,configuration,Php,Apache,Zend Framework,Configuration,我喜欢Zend框架中的工作方式。通过检查控制器中的应用程序_ENV常量,我可以知道当前使用的环境 <VirtualHost *:80> #ServerName #DocumentRoot SetEnv APPLICATION_ENV "development" # Directory </VirtualHost> #服务器名 #文档根 SetEnv应用程序_ENV“开发” #目录 但不幸的是,我不能在我当前的项目中使用Z

我喜欢Zend框架中的工作方式。通过检查控制器中的应用程序_ENV常量,我可以知道当前使用的环境

<VirtualHost *:80>
    #ServerName 
    #DocumentRoot

        SetEnv APPLICATION_ENV "development"

    # Directory
</VirtualHost>

#服务器名
#文档根
SetEnv应用程序_ENV“开发”
#目录
但不幸的是,我不能在我当前的项目中使用ZF。如何在PHP代码中检查此环境变量?

因为set是Apache环境的值,所以可以使用

  • -获取Apache子进程_env变量
或者只是

  • -获取环境变量的值

如果查看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');
    }
}
这样,您根本不必依赖环境设置。

定义环境变量

设置好后(在Apache配置中或在系统级别),您可以使用以下函数读取其值:

echo getenv('APPLICATION_ENV');

例如,如果在
.htaccess
文件中使用此选项:

SetEnv TEST glop
您可以使用这部分PHP代码:

var_dump(getenv('TEST'));
您将得到:

string 'glop' (length=4)

我有同样的问题,然后我解决了它。解决此问题的方法是在ApacheInit脚本中声明所有变量

我在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

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

您也可以从
$\u SERVER
变量访问它。

但对于仍在阅读此答案的人,有一件事需要注意:使用替代方法仅适用于通过url执行的脚本,命令行脚本(例如cron)将不知道$\u服务器['SERVER\u NAME']是什么,因此将默认为“production”。使用vhosts设置以确保。我必须在此处激活什么?任何特殊的mod。我尝试在parents目录.htaccess文件和site enable文件中使用SetEnv。仍然是getenv给了我
bool(false)
。连接到另一台服务器,在那里工作正常,我找不到任何服务器different@yellowsir检查Web服务器是否允许htaccess per dir,并确保在全局配置中设置此选项时重新启动apache。@gordon thx对于您的响应,我两次都做了,第一次是通过启用AllowOverride来完成的,对吗?``````[…]SetEnv APPLICATION_ENV production DocumentRoot/var/www[…]``添加一些解释和答案,说明此答案如何帮助解决当前问题我不明白。apachehttpd中没有“export”指令。另外,如何访问刚才在PHP中设置的其他变量?也许你不明白这个问题,或者我遗漏了什么。它是初始化脚本/etc/init.d/httpd是一个bashshell脚本。