PageRenderTime 47ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/system/library/error.php

https://bitbucket.org/MarcTowler/framework
PHP | 204 lines | 152 code | 26 blank | 26 comment | 20 complexity | 5da699e14af1fcf21827c8f8670ff74c MD5 | raw file
  1. <?php
  2. /**
  3. * Error Handling Class
  4. *
  5. * Allows the use of a custom error handler to control messages and logging
  6. *
  7. * @package Framework
  8. * @author Marc Towler <marc.towler@designdeveloprealize.com>
  9. * @copyright Copyright (c) 2008 - 2011 Design Develop Realize
  10. * @license http://www.designdeveloprealize.com/products/framework/license.html
  11. * @link http://www.designdeveloprealize.com
  12. * @since Version 0.1
  13. * @filesource
  14. */
  15. class error {
  16. public $ip;
  17. public $show_user;
  18. public $show_developer;
  19. public $email;
  20. public $log_file;
  21. public $log_message;
  22. public $email_sent = false;
  23. public $error_codes;
  24. public $warning_codes;
  25. public $error_names;
  26. public $error_numbers;
  27. public $errno;
  28. public $errstr;
  29. public $errfile;
  30. public $errline;
  31. public $errcontext;
  32. /**
  33. * Construct Function
  34. *
  35. * @access public
  36. * @param integer The IP address that generated the error
  37. * @param boolean Switch to show general user's any errors or not
  38. * @param integer Error display level for developers
  39. * @param string Email address to send an error alert to
  40. * @param string Path to log file to store error details
  41. */
  42. public function __contruct($ip = '127.0.0.1', $user = true, $dev = 2, $email, $log = 'test.com.txt')
  43. {
  44. $this->ip = $ip;
  45. $this->show_user = $user;
  46. $this->show_developer = $dev;
  47. $this->email = $email;
  48. $this->log_file = $log;
  49. $this->log_message = null;
  50. $this->error_codes = E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR;
  51. $this->warning_codes = E_WARNING | E_CORE_WARNING | E_COMPILE_WARNING | E_USER_WARNING;
  52. $this->error_names = array ('E_ERROR', 'E_WARNING', 'E_PARSE', 'E_NOTICE',
  53. 'E_COMPILE_ERROR', 'E_COMPILE_WARNING',
  54. 'E_USER_ERROR', 'E_USER_WARNING',
  55. 'E_USER_NOTICE', 'E_STRICT', 'E_RECOVERABLE_ERROR');
  56. for($i = 0, $j = 1, $num = count($this->error_names); $i < $num; $i++, $j = $j * 2)
  57. {
  58. $this->error_numbers[$j] = $this->error_names[$i];
  59. }
  60. }
  61. public function handle($errno, $errstr, $errfile, $errline, $errcontext)
  62. {
  63. $this->errno = $errno;
  64. $this->errstr = $errstr;
  65. $this->errfile = $errfile;
  66. $this->errline = $errline;
  67. $this->errcontext = $errcontext;
  68. if($this->log_file)
  69. {
  70. $this->log_error_msg();
  71. }
  72. if($this->email)
  73. {
  74. $this->send_error_msg();
  75. }
  76. if($this->show_user)
  77. {
  78. $this->error_msg_basic();
  79. }
  80. if($this->show_developer > 0 && preg_match("/^$this->ip$/i", $_SERVER['REMOTE_ADDR']))
  81. {
  82. $this->error_msg_detailed();
  83. }
  84. //Don't execute PHP internal error handler
  85. return true;
  86. }
  87. public function error_msg_basic()
  88. {
  89. $message;
  90. if($this->errno && $this->error_codes)
  91. {
  92. $message .= "<strong>ERROR:</strong> There has been a slight issue";
  93. }
  94. elseif ($this->warning_codes)
  95. {
  96. $message .= "<strong>WARNING:</strong> Something is not quite right";
  97. }
  98. if($message && $this->email_sent)
  99. {
  100. $message .= " The developers have been notified.<br />\n";
  101. } else {
  102. $message .= "<br />\n";
  103. }
  104. echo $message;
  105. }
  106. public function error_msg_detailed()
  107. {
  108. //settings for error display...
  109. $silent = (2 && $this->show_developer) ? true : false;
  110. $context = (4 && $this->show_developer) ? true : false;
  111. $backtrace = (8 && $this->show_developer) ? true : false;
  112. switch(true)
  113. {
  114. case(16 && $this->show_developer):
  115. $color = 'white';
  116. break;
  117. case(32 && $this->show_developer):
  118. $color = 'black';
  119. break;
  120. default:
  121. $color = 'red';
  122. }
  123. $message = ($silent) ? "<!--\n" : '';
  124. $message .= "<pre style='color:$color;'>\n\n";
  125. $message .= "file: " . print_r($this->errfile, true) . "\n";
  126. $message .= "line: " . print_r($this->errline, true) . "\n\n";
  127. $message .= "code: " . print_r($this->error_numbers[$this->errno], true) . "\n";
  128. $message .= "message: " . print_r( $this->errstr, true) . "\n\n";
  129. $message .= ($context) ? "context: " . print_r($this->errcontext, true) . "\n\n" : '';
  130. $message .= ($backtrace) ? "backtrace: " . print_r(debug_backtrace(), true)."\n\n" : '';
  131. $message .= "</pre>\n";
  132. $message .= ($silent) ? "-->\n\n" : '';
  133. echo $message;
  134. }
  135. public function send_error_msg()
  136. {
  137. $message = "file: " . print_r($this->errfile, true) . "\n";
  138. $message .= "line: " . print_r($this->errline, true) . "\n\n";
  139. $message .= "code: " . print_r($this->error_numbers[$this->errno], true) . "\n";
  140. $message .= "message: " . print_r($this->errstr, true) . "\n\n";
  141. $message .= "log: " . print_r($this->log_message, true) . "\n\n";
  142. $message .= "context: " . print_r($this->errcontext, true) . "\n\n";
  143. //$message .= "backtrace: " . print_r($this->debug_backtrace(), true) . "\n\n";
  144. $this->email_sent = false;
  145. if(mail($this->email, 'Error: ' . $this->errcontext['SERVER_NAME'] .
  146. $this->errcontext['REQUEST_URI'], $message, "From: error@" .
  147. $this->errcontext['HTTP_HOST'] . "\r\n"))
  148. {
  149. $this->email_sent = true;
  150. }
  151. }
  152. public function log_error_msg()
  153. {
  154. $message = "time: " . date("j M y - g:i:s A (T)", mktime()) . "\n";
  155. $message .= "file: " . print_r($this->errfile, true) . "\n";
  156. $message .= "line: " . print_r($this->errline, true) . "\n\n";
  157. $message .= "code: " . print_r($this->error_numbers[$this->errno], true) . "\n";
  158. $message .= "message: " . print_r($this->errstr, true) . "\n";
  159. $message .= "##################################################\n\n";
  160. if(!$fp = fopen($this->log_file, 'a+'))
  161. {
  162. $this->log_message = "Could not open/create file: $this->log_file
  163. to log error.";
  164. $log_error = true;
  165. }
  166. if(!fwrite($fp, $message))
  167. {
  168. $this->log_message = "Could not log error to file: $this->log_file.
  169. Write Error.";
  170. $log_error = true;
  171. }
  172. if(!$this->log_message)
  173. {
  174. $this->log_message = "Error was logged to file: $this->log_file.";
  175. fclose($fp);
  176. }
  177. }
  178. }