Source for file Debug.php
Documentation is available at Debug.php 
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */  
 * PHP_Debug : A simple and fast way to debug your PHP code  
 * The basic purpose of PHP_Debug is to provide assistance in debugging PHP  
 * code, by 'debug' i don't mean 'step by step debug' but program trace,  
 * variables display, process time, included files, queries executed, watch  
 * variables... These informations are gathered through the script execution and  
 * therefore are displayed at the end of the script (in a nice floating div or a  
 * html table) so that it can be read and used at any moment. (especially  
 * usefull during the development phase of a project or in production with a  
 * Copyright (c) 2007 - Vernet Loïc  
 * Permission is hereby granted, free of charge, to any person obtaining a copy  
 * of this software and associated documentation files (the "Software"), to deal  
 * in the Software without restriction, including without limitation the rights  
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  
 * copies of the Software, and to permit persons to whom the Software is  
 * furnished to do so, subject to the following conditions:  
 * The above copyright notice and this permission notice shall be included in  
 * all copies or substantial portions of the Software.  
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE  
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  
 * @package    linea21.externals  
 * @author     Vernet Loïc <qrf_coil[at]yahoo.fr>, modified by Linea21 <info@linea21.com>  
 * @copyright  1997-2007 The PHP Group  
 * @license    http://www.opensource.org/licenses/mit-license.php MIT  
 * @link       http://pear.php.net/package/PHP_Debug  
 * @link       http://phpdebug.sourceforge.net  
 * @link       http://www.php-debug.com  
 * @see        Var_Dump, SQL_Parser  
 * @version    CVS: $Id: Debug.php,v 1.6 2009/01/12 21:13:00 c0il Exp $  
 * Factory class for renderer of Debug class  
 * @see Debug/Renderer/*.php  
require_once 'DebugLine.php';  
require_once 'Debug/Renderer.php';  
   * Possible version of class Debug  
  const VERSION_STANDALONE =  0;  
  const VERSION_DEFAULT    =  self::VERSION_STANDALONE;  
  const VERSION            =  self::VERSION_STANDALONE;  
  const RELEASE            =  'V2.1.5';  
  const PEAR_RELEASE       =  'V1.0.3';  
   * These are constant for dump() and DumpObj() functions.  
   * - DUMP_DISP : Tell the function to display the debug info.  
   * - DUMP_STR  : Tell the fonction to return the debug info as a string  
   * - DUMP_VARNAME : Default name of Array - DBG_ARR_OBJNAME : Default name  
  const DUMP_VARNAME =  'Variable';  
   * These are constant for addDebug functions, they set the behaviour where  
   * the function should add the debug information in first or in last  
   * These are constants to define Super array environment variables  
  const GLOBAL_REQUEST =  4;  
  const GLOBAL_SESSION =  5;  
  const GLOBAL_GLOBALS =  6;  
   * Default configuration options  
   * @since V2.0.0 - 16 apr 2006  
        'render_mode'          =>  'Div',              // Renderer mode  
        'render_type'          =>  'HTML',             // Renderer type  
        'restrict_access'      =>  false,              // Restrict or not the access  
        'allowed_ip'           =>  array('127.0.0.1'), // Authorized IP to view the debug when restrict_access is true  
        'allow_url_access'     =>  false,              // Allow to access the debug with a special parameter in the url  
        'url_key'              =>  'debug',            // Key for url instant access  
        'url_pass'             =>  'true',             // Password for url instant access  
        'enable_watch'         =>  false,              // Enable the watch function  
        'replace_errorhandler' =>  true,               // Replace or no the PHP errorhandler  
        'lang'                 =>  'EN',               // Language  
   * Default static options for static functions  
   * @since V2.0.0 - 16 apr 2006  
  protected static $staticOptions =  array(  
        'dump_method'          =>  'print_r',          // print_r or var_dump  
        'pear_var_dump_method' =>  'Var_Dump::display' // Var_Dump display funtion (not used for now)  
   * Functions from this class that must be excluded in order to have the  
   * correct backtrace information  
   * @see PHP_DebugLine::setTraceback()  
   * @since V2.0.0 - 13 apr 2006  
  public static $excludedBackTraceFunctions =  array(  
         * Correspondance between super array constant and variable name  
         * @since V2.0.0 - 18 apr 2006  
        public static $globalEnvConstantsCorresp =  array(  
        self::GLOBAL_GET    =>  '_GET',  
        self::GLOBAL_POST   =>  '_POST',  
        self::GLOBAL_FILES  =>  '_FILES',  
        self::GLOBAL_COOKIE =>  '_COOKIE',  
        self::GLOBAL_REQUEST=>  '_REQUEST',  
        self::GLOBAL_SESSION=>  '_SESSION',  
        self::GLOBAL_GLOBALS=>  'GLOBALS'  
         * Default configuration options  
         * @since V2.0.0 - 13 apr 2006  
         * This is the array where the debug lines are collected.  
         * @since V2.0.0 - 11 apr 2006  
         * This is the array containing all the required/included files of the  
         * @since V2.0.0 - 17 apr 2006  
         * @see render(), PHP_DebugLine::TYPE_TEMPLATES  
         * This is the array containing all the watched variables  
         * @since V2.0.0 - 16 apr 2006  
         * @since V2.0.0 - 11 apr 2006  
         * @since V2.0.0 - 11 apr 2006  
         * Number of queries executed during script  
         * @since V2.0.0 - 19 apr 2006  
         * PHP_Debug class constructor  
         * - the execution start time  
         * - the error and watch call back functions  
         * @param array $options    Array containing options to affect to Debug  
         * @since V2.0.0 - 11 apr 2006  
         * Add a debug information  
         * @param string  $info  The main debug information  
         *                       (may be empty for some debug line types)  
         * @param integer $type Type of the DebugLine  
         * @since V1.0.0 - 07 Apr 2006  
        public function addDebug($info, $type =  PHP_DebugLine::TYPE_STD,  
        $position =  self::POSITIONLAST)  
          if ($position ==  self::POSITIONLAST) {  
          // Additional process for some types  
         * Add a debug info before all the existing other debug lines  
         * It is an alias for addDebug($info, self::POSITIONLAST)  
         * @since V1.0.0 - 13 Apr 2006  
        public function addDebugFirst($info, $type =  PHP_DebugLine::TYPE_STD)  
          return $this->addDebug($info, $type, self::POSITIONFIRST);  
         * This is an alias for the addDebug function  
         * @since  V2.0.0 - 20 apr 2006  
        public function add($info, $type =  PHP_DebugLine::TYPE_STD)  
         * This is an alias for the addDebug function when wanting to add a query  
         * @see addDebug(), PHP_DebugLine::TYPE_QUERY  
         * @since V2.0.0 - 21 Apr 2006  
        public function query($qry)  
         * This is an alias for the addDebug function when wanting to add a  
         * database related debug info  
         * @see addDebug(), PHP_DebugLine::TYPE_QUERYREL  
         * @since V2.1.0 - 3 apr 2007  
         * This is an alias for the addDebug function when wanting to add an  
         * @see addDebug(), PHP_DebugLine::TYPE_APPERROR  
         * @since V2.0.0 - 21 Apr 2006  
        public function error($info)  
         * This is an alias for adding the monitoring of processtime  
         * @see addDebug(), PHP_DebugLine::TYPE_PROCESSPERF  
         * @since V2.1.0 - 21 Apr 2006  
         * This a method to dump the content of any variable and add the result in  
         * @param   mixed       $var        Variable to dump  
         * @param   string      $varname    Name of the variable  
         * @since V2.0.0 - 25 Apr 2006  
        public function dump($obj, $varName =  '')  
         * Set the main action of PHP script  
         * @param string $action Name of the main action of the file  
         * @since V2.0.0 - 25 Apr 2006  
         * @see PHP_DebugLine::TYPE_CURRENTFILE  
         * Add an application setting  
         * @param string $action Name of the main action of the file  
         * @since V2.1.0 - 02 Apr 2007  
         * @see PHP_DebugLine::TYPE_ENV  
         * Add a group of settings  
         * @param string $action Name of the main action of the file  
         * @since V2.1.0 - 2 Apr 2007  
         * @see PHP_DebugLine::TYPE_ENV  
         * Set the callback fucntion to process the watches, enabled depending of  
         * the options flag 'enable_watch'  
         * @since V2.0.0 - 16 apr 2006  
         * @see options, watches, watchesCallback()  
          if ($this->options['enable_watch'] ==  true) {  
              $watchMethod =  array($this, 'watchesCallback');  
         * Set the callback function to process replace the php error handler,  
         * enabled depending of the options flag 'replace_errorhandler'  
         * @since V2.0.0 - 16 apr 2006  
         * @see options, errorHandlerCallback()  
          if ($this->options['replace_errorhandler'] ==  true) {  
         * Callback function for php error handling  
         * Warning : the only PHP error codes that are processed by this user  
         * handler are : E_WARNING, E_NOTICE, E_USER_ERROR  
         * For the other error codes the standart php handler will be used  
         * @since V2.0.0 - 17 apr 2006  
         * @see options, setErrorHandler()  
          // We already have line & file with setBackTrace function  
          for ($index =  0; $index <  $popNumber; $index++ ) {  
          if ($details[0] !=  E_STRICT)  
         * Add a variable to the watchlist. Watched variables must be in a declare  
         * (ticks=n) block so that every n ticks the watched variables are checked  
         * for changes. If any changes were made, the new value of the variable is  
         * @param string $variableName      Variable to watch  
         * @since V2.0.0 - 17 apr 2006  
        public function watch($variableName)  
          if ($this->options['enable_watch'] ==  true) {  
            if (isset ($GLOBALS[$variableName])) {  
              $this->watches[$variableName] =  $GLOBALS[$variableName];  
              $this->watches[$variableName] =  null;  
            throw  new Exception('The Watch function is disabled please set the option \'enable_watch\' to \'true\' to be able to use this feature, it\'s stable with a Unix server'); 
         * Watch callback function, process watches and add changes to the debug  
         * @since V2.0.0 - 17 apr 2006  
          // Check if there are variables to watch  
            foreach ($this->watches as $variableName =>  $variableValue) {  
              if ($GLOBALS[$variableName] !==  $this->watches[$variableName]) {  
                $this->watches[$variableName] =  $GLOBALS[$variableName];  
         * Get global process time  
         * @return  float             Execution process time of the script  
         * @since V2.0.0 - 21 Apr 2006  
         * Get database related process time  
         * @return  float      Execection process time of the script for all  
         *                         database    specific tasks  
         * @see PHP_DebugLine::TYPE_QUERY, PHP_DebugLine::TYPE_QUERYREL  
         * @since V2.0.0 - 21 Apr 2006  
            $properties =  $lvalue->getProperties();  
              if (!empty($properties['endTime'])) {  
                $queryTime =  $queryTime +   
                $properties['startTime'],  
         * PHP_Debug default output function, first we finish the processes and  
         * then a render object is created and its render method is invoked  
         * The renderer used is set with the options, all the possible renderer  
         * are in the directory Debug/Renderer/*.php  
         * (not the files ending by '_Config.php')  
         * @since V2.0.0 - 13 apr 2006  
          // Render output if we are allowed to  
            // Create render object and invoke its render function  
            // Get required files here to have event all Debug classes  
            return $renderer->render();  
         * Alias for the render function  
         * @since V2.0.0 - 17 apr 2006  
         * Return the output without displaying it  
         * @since V2.0.1 - 17 apr 2006  
         * Restrict access to a list of IP  
         * @param array $ip     Array with IP to allow access  
         * @since V2.0.0 - 11 Apr 2006  
         * @see $options, isAllowed()  
          $this->options['allowed_ip'] =  $ip;  
         * Test if the client is allowed to access the debug information  
         * There are several possibilities :  
         * - 'restrict_access' flag is set to false  
         * - 'restrict_access' flag is set to true and client IP is the  
         * allowed ip in the options 'allowed_ip'  
         * - Access by url is allowed with flag 'allow_url_access' then  
         * the client must enter the good key and password in the url  
         * @since V2.0.0 - 20 apr 2006  
         * @see $options, restrictAcess()  
          if ($this->options['restrict_access'] ==  true) {  
            // Check if client IP is among the allowed ones  
            // Check if instant access is allowed and test key and password  
            elseif ($this->options['allow_url_access'] ==  true) {  
              if (!empty($_GET[$key])) {  
                if ($_GET[$key] ==  $this->options['url_pass']) {  
            // Access is not restricted  
         * Return microtime from a timestamp  
         * @param $time     Timestamp to retrieve micro time  
         * @return numeric  Microtime of timestamp param  
         * @since V1.1.0 - 14 Nov 2003  
          list ($usec, $sec) =  explode(' ', $time); 
          return (float) $usec + (float) $sec;  
         * Alias for getMicroTime(microtime()  
         * @since V2.0.0 - 19 apr 2006  
         * Get elapsed time between 2 timestamp  
         * @param   float $timeStart    Start time  
         * @param   float $timeEnd      End time  
         * @return  float               Numeric difference between the two times  
         *                               ref in format 00.0000 sec  
         * @since V1.0.0 - 20 Oct 2003  
          return round($timeEnd -  $timeStart, 4);  
         * Returns Uri prefix, including protocol, hostname and server port.  
         * @return string Uniform resource identifier prefix  
          $port =  $pathArray['SERVER_PORT'] ==  $standardPort ||  !$pathArray['SERVER_PORT'] ?  '' :  ':'. $pathArray['SERVER_PORT'];  
          return $proto. '://'.  $pathArray['SERVER_NAME'].  $port;  
         * @since V2.1.1 - 23 avr. 2007  
          return $_SERVER['SERVER_PORT'] !=  80;  
         * Returns current host name.  
         * @since    V2.1.1 - 23 avr. 2007  
          return isset ($pathArray['HTTP_X_FORWARDED_HOST']) ?  $pathArray['HTTP_X_FORWARDED_HOST'] :  (isset ($pathArray['HTTP_HOST']) ?  $pathArray['HTTP_HOST'] :  '');  
         * Returns current script name.  
         * @since V2.1.1 - 23 avr. 2007  
          return isset ($pathArray['SCRIPT_NAME']) ?  $pathArray['SCRIPT_NAME'] :  (isset ($pathArray['ORIG_SCRIPT_NAME']) ?  $pathArray['ORIG_SCRIPT_NAME'] :  '');  
         * Return the query string  
         * @since 2.1.1 - 23 avr. 2007  
          return $_SERVER['QUERY_STRING'] ?  '?'.  $_SERVER['QUERY_STRING'] :  '';  
         * @since 2.1.1 - 23 avr. 2007  
        public static function getUrl()  
          return self::getUriPrefix().  self::getScriptName().  self::getQueryString();  
         * Set the endtime for a DebugLine in order to monitor the performance  
         * @see PHP_DebugLine::endTime  
         * @since V2.0.0 - 19 apr 2006  
         * Display the content of any kind of variable  
         * - Mode PHP_DEBUG_DUMP_ARR_DISP display the array  
         * - Mode PHP_DEBUG_DUMP_ARR_STR return the infos as a string  
         * @param   mixed       $var        Variable to dump  
         * @param   string      $varname    Name of the variable  
         * @param   integer     $mode       Mode of function  
         * @param   boolean     $stopExec   Stop the process after display of debug  
         * @return  mixed                   Nothing or string depending on the mode  
         * @since V2.0.0 - 25 Apr 2006  
        $varName =  self::DUMP_VARNAME,  
        $mode =  self::DUMP_DISP) {  
          $dumpMethod =  self::$staticOptions['dump_method'];  
              $dbgBuffer =  '<pre><b>dump of \''.  $varName.  '\'</b> :'.   
              CR.  $dbgBuffer.  '</pre>';  
            $dieMsg  =  '<pre><b>Process stopped by PHP_Debug</b>'.  CR;  
            $dieMsg .=  $backtrace[0]['file'] ?      '» file     : <b>'.   
            $backtrace[0]['file'] . '</b>'.  CR :  '';  
            $dieMsg .=  $backtrace[0]['line'] ?      '» line     : <b>'.   
            $backtrace[0]['line'] . '</b>'.  CR :  '';  
            $dieMsg .=  $backtrace[1]['class'] ?     '» class    : <b>'.   
            $backtrace[1]['class'] . '</b>'.  CR :  '';  
            $dieMsg .=  $backtrace[1]['function'] ?  '» function : <b>'.   
            $backtrace[1]['function'] . '</b>'.  CR :  '';  
         * @param string $optionsIdx Name of the option to get  
         * @since V2.0.0 - 13 apr 2006  
         * Getter of requiredFiles property  
         * @return array Array with the included/required files  
         * @since V2.0.0 - 13 apr 2006  
         * Getter of debugString property  
         * @since V2.0.0 - 13 apr 2006  
         * Getter of queryCount property  
         * @since V2.0.0 - 21 Apr 2006  
         * Debug default output function, simply uses the static dump fonction  
         * @since V2.0.0 - 11 apr 2006  
          __CLASS__.  ' class instance', 
 
 
        
       |