PageRenderTime 60ms CodeModel.GetById 34ms RepoModel.GetById 0ms app.codeStats 0ms

/core/libs/Error.php

https://bitbucket.org/vaneves/repono
PHP | 220 lines | 131 code | 24 blank | 65 comment | 19 complexity | a9f7e3a75c012766bc07896a3bb3bada MD5 | raw file
  1. <?php
  2. /*
  3. * Copyright (c) 2012, Valdirene da Cruz Neves Júnior <vaneves@vaneves.com>
  4. * All rights reserved.
  5. */
  6. /**
  7. * Classe de manipulação e apresentação dos erros
  8. * @author Valdirene da Cruz Neves Júnior <vaneves@vaneves.com>
  9. * @version 1.4
  10. *
  11. */
  12. class Error
  13. {
  14. /**
  15. * Método que é executado quando ocorre algum erro no PHP
  16. * @param int $type tipo do erro, que pode ser E_STRICT
  17. * @param sintrg $message mensagem do erro
  18. * @param string $file endereço completo do arquivo que ocorreu o erro
  19. * @param int $line linha do arquivo em que ocorreu o erro
  20. * @return void
  21. */
  22. public static function handle($type, $message, $file, $line)
  23. {
  24. ob_get_level() and ob_clean();
  25. if(Debug::enabled())
  26. {
  27. if($type != E_STRICT)
  28. {
  29. $details = self::lineAsString($file, $line);
  30. $trace = self::traceAsString();
  31. self::render(500, $message, $file, $line, $trace, $details);
  32. exit;
  33. }
  34. }
  35. else
  36. {
  37. $types = array(
  38. E_ERROR => 'ERROR',
  39. E_WARNING => 'WARNING',
  40. E_PARSE => 'PARSING ERROR',
  41. E_NOTICE => 'NOTICE',
  42. E_CORE_ERROR => 'CORE ERROR',
  43. E_CORE_WARNING => 'CORE WARNING',
  44. E_COMPILE_ERROR => 'COMPILE ERROR',
  45. E_COMPILE_WARNING => 'COMPILE WARNING',
  46. E_USER_ERROR => 'USER ERROR',
  47. E_USER_WARNING => 'USER WARNING',
  48. E_USER_NOTICE => 'USER NOTICE',
  49. E_STRICT => 'RUNTIME NOTICE'
  50. );
  51. $t = 'CAUGHT ERROR';
  52. if(isset($types[$type]))
  53. $t = $types[$type];
  54. $log = date('Y-m-d H:i:s') . ' ' . $t. ': ' . $message . ' in ' . $file . ' ('. $line .')' . NL;
  55. self::log($log);
  56. }
  57. }
  58. /**
  59. * Método executado quando ocorre algum erro fatal no PHP, esse método é chamado
  60. * antes que o PHP pare a execução da página
  61. * @return void
  62. */
  63. public static function shutdown()
  64. {
  65. $error = error_get_last();
  66. if (is_array($error))
  67. self::handle($error['type'], $error['message'], $error['file'], $error['line']);
  68. }
  69. /**
  70. * Método executado quando algumas exceção não foi tratada
  71. */
  72. public static function exception()
  73. {
  74. }
  75. /**
  76. * Método para apresentar a página de erro. Mata execução
  77. * @param int $number número do erro HTTP
  78. * @param string $message mensagem do erro
  79. * @param string $file endereço completo do arquivo em que ocorreu o erro
  80. * @param int $line número da linha em que ocorreu o erro
  81. * @param string $trace trilha de arquivo antes de ocorrer o erro
  82. * @param string $details detalhes do erro, apresenta o trecho do arquivo em que ocorreu o erro
  83. * @return void
  84. */
  85. public static function render($number, $message, $file, $line, $trace = null, $details = null)
  86. {
  87. if (Debug::enabled())
  88. return require_once root . 'core/error/debug.php';
  89. $files = array();
  90. $files[0] = root . 'app/views/_error/' . $number . '.php';
  91. $files[1] = root . 'core/error/default.php';
  92. foreach ($files as $f)
  93. {
  94. if (file_exists($f))
  95. return require_once $f;
  96. }
  97. exit('error');
  98. }
  99. /**
  100. * Monta a trilha do erro, retornando um array com os nomes do arquivos, classes, métodos e linhas
  101. * @param array $trace trilha padrão para montar a nova trilha
  102. * @return array retornando um array com os nomes do arquivos, classes, métodos e linhas
  103. */
  104. public static function trace($trace = null)
  105. {
  106. if ($trace == null)
  107. $trace = debug_backtrace();
  108. $output = array();
  109. $i = 0;
  110. foreach ($trace as $v)
  111. {
  112. if (!isset($v['function']))
  113. continue;
  114. $function = $v['function'];
  115. if (isset($v['class']))
  116. $function = $v['class'] . $v['type'] . $v['function'];
  117. $output[$i]['function'] = $function;
  118. $output[$i]['args'] = isset($v['args']) ? $v['args'] : '';
  119. $output[$i]['file'] = isset($v['file']) ? $v['file'] : '';
  120. $output[$i]['line'] = isset($v['line']) ? $v['line'] : '';
  121. $output[$i]['source'] = isset($v['source']) ? $v['source'] : '';
  122. ++$i;
  123. }
  124. return $output;
  125. }
  126. /**
  127. * Transforma uma trilha em uma string para impressão
  128. * @param array $trace trilha padrão, se for informado, é chamado o método trace
  129. * @return string retorna a trinha em formato para impressão
  130. */
  131. public static function traceAsString($trace = null)
  132. {
  133. if ($trace == null)
  134. $trace = self::trace();
  135. $output = '';
  136. foreach ($trace as $k => $v)
  137. $output .= '#' . $k . ' ' . $v['file'] . '(' . $v['line'] . ') ' . $v['function'] . nl;
  138. return $output;
  139. }
  140. /**
  141. * Captura o trecho do arquivo de acordo com a linha passado como parâmetro e retorna as linhas como array
  142. * @param string $file endereço completo do arquivo em que ocorreu o erro
  143. * @param int $line número da linha em que ocorreu o erro
  144. * @param int $padding quantidade de linha antes e depois da linha do erro serão capturadas
  145. * @return array retorna um array contendo os trechos das linhas capturadas
  146. */
  147. public static function line($file, $line, $padding = 5)
  148. {
  149. $output = array();
  150. $i = 1;
  151. $handle = fopen($file, "r");
  152. if ($handle)
  153. {
  154. $start = $line - $padding;
  155. $end = $line + $padding;
  156. while ($i <= $end && (($buffer = fgets($handle, 4096)) !== false))
  157. {
  158. if($i >= $start)
  159. $output[$i] = $buffer;
  160. ++$i;
  161. }
  162. fclose($handle);
  163. }
  164. return $output;
  165. }
  166. /**
  167. * Captura o trecho do arquivo de acordo com a linha passado como parâmetro e retorna as linhas como HTML
  168. * @param string $file endereço completo do arquivo em que ocorreu o erro
  169. * @param int $line número da linha em que ocorreu o erro
  170. * @param int $padding quantidade de linha antes e depois da linha do erro serão capturadas
  171. * @return array retorna um HTML contendo os trechos das linhas capturadas
  172. */
  173. public static function lineAsString($file, $line, $padding = 5)
  174. {
  175. $lines = self::line($file, $line, $padding);
  176. $output = '';
  177. foreach($lines as $i => $l)
  178. {
  179. if($i == $line)
  180. $output .= '<span class="line line-error"><span class="line-n">'. $i .'</span>' . htmlentities($l) . '</span>';
  181. else
  182. $output .= '<span class="line"><span class="line-n">'. $i .'</span>' . htmlentities($l) . '</span>';
  183. }
  184. return $output;
  185. }
  186. /**
  187. * Escreve uma mensagem nos arquivos de logs
  188. * @param string $string conteúdo a ser escrito
  189. * @return boolean retorna true caso o log seja gerado, no contrário retorna false
  190. */
  191. public static function log($string)
  192. {
  193. $bytes = file_put_contents(ROOT . 'app/tmp/logs/' . date('Y-m-d') . '.log', $string, FILE_APPEND);
  194. return $bytes !== false;
  195. }
  196. }