rinat.io


Handling Yii Debug Mode

If you're working with Yii, you most probably know what YII_DEBUG constant is and you know that it should be disabled on production servers. Default Yii bootstrap just put a note in index.php saying that you should remove "define-yii-debug-true" line in production mode, but how would you handle that? I've seen few different approaches.

Create specific file for debug mode

It might be something like debugmodeon in your project directory. In your index.php you check if that file exists or not and enable/disable debug accordingly. This approch forces you to apply some VCS stuff, for example you have to put debugmodeon into .gitignore.

Put settings into environment config

If you use an architecture like YiiBoilerplate with different config for specific environment, you might put code to enable/disable debug in those config files, but... In this case you should include that config before Yii being included, otherwise Yii will define constant itself and you will get a notice that "Constant YII_DEBUG already defined". So you have to either replace CMap::mergeArray with something else, or load CMap class directly without Yii autoload.

Use server environment variable

In my opinion best approach is to use server environment variable (like APPLICATION_ENV/RAILS_ENV in ZF/RoR). It's quite simple and you don't have to handle .gitignore or do some magic with configs.

if (!defined('YII_DEBUG') && getenv('YII_DEBUG')) {
    define('YII_DEBUG', true);
}
// In apache:
// SetEnv YII_DEBUG 1

// Or nginx:
// fastcgi_param YII_DEBUG 1;

You can even set that value for whole server, and every project will use it. The only drawback is that you have to know apache or nginx config a little bit :)