return implode("\n", $html); } static function getLoggingTabPane($requestId, $request) { $html = array(); $html[] = '<div class="tab-pane" id="debug-request-' . $requestId . '-logging">'; $html[] = '<br/><pre>'; foreach ($request['log'] as $log) { $html[] = htmlspecialchars($log) . "\n"; } $html[] = '</pre>'; $html[] = '</div>'; return implode("\n", $html); } } Debugger::$enabled = false; // Start the session Session::start(); ?> <!DOCTYPE html> <html> <head> <base href="<?php echo Router::getBaseUrl(); ?> "> <title>MindaPHP Debugger</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="shortcut icon" href="debugger/img/favicon.ico"> <!-- Bootstrap -->
public static function enable($mode = NULL, $logDirectory = NULL, $email = NULL) { error_reporting(E_ALL | E_STRICT); if (is_bool($mode)) { self::$productionMode = $mode; } elseif (is_string($mode)) { $mode = preg_split('#[,\\s]+#', "{$mode} 127.0.0.1 ::1"); } if (is_array($mode)) { self::$productionMode = !isset($_SERVER['REMOTE_ADDR']) || !in_array($_SERVER['REMOTE_ADDR'], $mode, TRUE); } if (self::$productionMode === self::DETECT) { if (class_exists('Environment')) { self::$productionMode = Environment::isProduction(); } elseif (isset($_SERVER['SERVER_ADDR']) || isset($_SERVER['LOCAL_ADDR'])) { $addrs = array(); if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $addrs = preg_split('#,\\s*#', $_SERVER['HTTP_X_FORWARDED_FOR']); } if (isset($_SERVER['REMOTE_ADDR'])) { $addrs[] = $_SERVER['REMOTE_ADDR']; } $addrs[] = isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : $_SERVER['LOCAL_ADDR']; self::$productionMode = FALSE; foreach ($addrs as $addr) { $oct = explode('.', $addr); if ($addr !== '::1' && (count($oct) !== 4 || $oct[0] !== '10' && $oct[0] !== '127' && ($oct[0] !== '172' || $oct[1] < 16 || $oct[1] > 31) && ($oct[0] !== '169' || $oct[1] !== '254') && ($oct[0] !== '192' || $oct[1] !== '168'))) { self::$productionMode = TRUE; break; } } } else { self::$productionMode = !self::$consoleMode; } } if (is_string($logDirectory)) { self::$logDirectory = realpath($logDirectory); if (self::$logDirectory === FALSE) { throw new DirectoryNotFoundException("Directory '{$logDirectory}' is not found."); } } elseif ($logDirectory === FALSE) { self::$logDirectory = FALSE; } else { self::$logDirectory = defined('APP_DIR') ? APP_DIR . '/../log' : getcwd() . '/log'; } if (self::$logDirectory) { ini_set('error_log', self::$logDirectory . '/php_error.log'); } if (function_exists('ini_set')) { ini_set('display_errors', !self::$productionMode); ini_set('html_errors', FALSE); ini_set('log_errors', FALSE); } elseif (ini_get('display_errors') != !self::$productionMode && ini_get('display_errors') !== (self::$productionMode ? 'stderr' : 'stdout')) { throw new NotSupportedException('Function ini_set() must be enabled.'); } if ($email) { if (!is_string($email)) { throw new InvalidArgumentException('Email address must be a string.'); } self::$email = $email; } if (!defined('E_DEPRECATED')) { define('E_DEPRECATED', 8192); } if (!defined('E_USER_DEPRECATED')) { define('E_USER_DEPRECATED', 16384); } if (!self::$enabled) { register_shutdown_function(array(__CLASS__, '_shutdownHandler')); set_exception_handler(array(__CLASS__, '_exceptionHandler')); set_error_handler(array(__CLASS__, '_errorHandler')); self::$enabled = TRUE; } }
/** * Handler to catch uncaught exception. * @param Exception * @return void * @internal */ public static function _exceptionHandler(Exception $exception) { if (!headers_sent()) { // for PHP < 5.2.4 $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'; header($protocol . ' 500', TRUE, 500); } try { if (self::$productionMode) { try { self::log($exception, self::ERROR); } catch (Exception $e) { echo 'FATAL ERROR: unable to log error'; } if (self::$consoleMode) { echo "ERROR: the server encountered an internal error and was unable to complete your request.\n"; } elseif (self::isHtmlMode()) { require dirname(__FILE__) . '/templates/error.phtml'; } } else { if (self::$consoleMode) { // dump to console echo "{$exception}\n"; if ($file = self::log($exception)) { echo "(stored in {$file})\n"; if (self::$browser) { exec(self::$browser . ' ' . escapeshellarg($file)); } } } elseif (self::isHtmlMode()) { // dump to browser self::$blueScreen->render($exception); if (self::$bar) { self::$bar->render(); } } elseif (!self::fireLog($exception, self::ERROR)) { // AJAX or non-HTML mode $file = self::log($exception); if (!headers_sent()) { header("X-Nette-Error-Log: {$file}"); } } } foreach (self::$onFatalError as $handler) { call_user_func($handler, $exception); } } catch (Exception $e) { if (self::$productionMode) { echo self::isHtmlMode() ? '<meta name=robots content=noindex>FATAL ERROR' : 'FATAL ERROR'; } else { echo "FATAL ERROR: thrown ", get_class($e), ': ', $e->getMessage(), "\nwhile processing ", get_class($exception), ': ', $exception->getMessage(), "\n"; } } self::$enabled = FALSE; // un-register shutdown function exit(255); }
/** * Static public method to set dubugger mode. * * @param boolean $mode */ static public function setMode($mode = false) { self::$enabled = $mode; }
/** * Initialisize Config * * @static */ public static function init() { Debugger::$_config = Kohana::$config->load('debugger'); Debugger::$enabled = Debugger::$_config->enabled; }