Set Application_ENV via virtual host config and read this in PHP

PhpApacheZend FrameworkConfiguration

Php Problem Overview


I like how this works in Zend Framework. I can know which environment I'm currently using by checking APPLICATION_ENV constant in my controller.

<VirtualHost *:80>
	#ServerName 
	#DocumentRoot
    
        SetEnv APPLICATION_ENV "development"

	# Directory
</VirtualHost>

But unfortunately I can't use ZF in my current project. How can I check this environment variable in my PHP code?

Php Solutions


Solution 1 - Php

Since SetEnv set's the value to Apache's environment, you can get it with

or just

  • getenv — Gets the value of an environment variable

If you look at public/index.php in a ZF project, you will see ZF uses getenv:

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? 
                                  getenv('APPLICATION_ENV') : 
                                  'production'));

An often use alternative would be to read the Hostname from PHP and define the constant accordingly:

if(!defined('APPLICATION_ENV')) {
    if(FALSE === stripos($_SERVER['SERVER_NAME'], 'www.yourdomain.com')) {
        define(APPLICATION_ENV, 'development');
    } else {
        define(APPLICATION_ENV, 'production');
    }
}

This way, you don't have to rely on the environment setting at all.

Solution 2 - Php

SetEnv defines an environment variable.

Once this has been set (either in your Apache's configuration, or at the system level), you can read its value using the getenv function :

echo getenv('APPLICATION_ENV');


For instance, if you use this in your .htaccess file :

SetEnv TEST glop

You can use this portion of PHP code :

var_dump(getenv('TEST'));

And you'll get :

string 'glop' (length=4)

Solution 3 - Php

you can also access it from the $_SERVER variable.

Solution 4 - Php

I had the same problem then I solved it. The way to solve the problem is to declare all variables in an apache init script.

I'm using apache on centos and the init script is located in /etc/init.d/httpd

Add this code, but change it to meet your specific case.

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

This solved my problem. I hope this helps.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNikita FedyashevView Question on Stackoverflow
Solution 1 - PhpGordonView Answer on Stackoverflow
Solution 2 - PhpPascal MARTINView Answer on Stackoverflow
Solution 3 - PhpO_o lovesCandyView Answer on Stackoverflow
Solution 4 - PhpFirman SyahView Answer on Stackoverflow