我对PHP和自定义错误处理程序的设置相当新,但我有一些代码在CI之外工作正常,但我无法弄清楚如何将其集成到CI控制器中。我收到错误“消息:未定义属性:错误:: $ my_error_handler”
我的控制器是:
<?php
class Errors extends CI_Controller {
public function __construct()
{
parent::__construct();
}
function my_error_handler($number, $message, $file, $line, $vars)
{
$email = "
<p>An error ($number) occurred on line
<strong>$line</strong> and in the <strong>file: $file.</strong>
<p> $message </p>";
$email .= "<pre>" . print_r($vars, 1) . "</pre>";
$headers = 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
// Email the error to someone...
error_log($email, 1, 'name@domain.com', $headers);
// Make sure that you decide how to respond to errors (on the user's side)
// Either echo an error message, or kill the entire project. Up to you...
// The code below ensures that we only "die" if the error was more than
// just a NOTICE.
if ( ($number !== E_NOTICE) && ($number < 2048) ) {
die("There was an error. Please try again later.");
}
}
function test()
{
// We should use our custom function to handle errors.
set_error_handler($this->my_error_handler);
// Trigger an error... (var doesn't exist)
echo $somevarthatdoesnotexist;
}
}
?>
如果有更好的方式使用CI发送错误消息,请告诉我。
答案 0 :(得分:8)
我不认为扩展CI_Controller是解决这个问题的正确方法。相反,只要记录错误,您应该扩展CI_Logs以发送电子邮件:
class MY_Log extends CI_Log {
function MY_Log(){
parent::__construct();
}
function write_log($level = 'error', $msg, $php_error = FALSE){
$result = parent::write_log($level, $msg, $php_error);
if ($result == TRUE && strtoupper($level) == 'ERROR') {
$message = "An error occurred: \n\n";
$message .= $level.' - '.date($this->_date_fmt). ' --> '.$msg."\n";
$this->CI =& get_instance();
$to = $this->CI->config->item('email_admin_address');
$from_name = $this->CI->config->item('email_general_name');
$from_address = $this->CI->config->item('email_general_address');
$subject = 'An error has occured';
$headers = "From: $from_name <$from_address>" . "\r\n";
$headers .= 'Content-type: text/plain; charset=utf-8\r\n';
mail($to, $subject, $message, $headers);
}
return $result;
}
}
将此类保存到application \ libraries \ MY_Logs.php,不要忘记在config.php中启用错误记录:$config['log_threshold'] = 1;
感谢WPStorm,他首先提出了这个想法。
答案 1 :(得分:2)
我找到了解决方案。
set_error_handler(array(&$this, 'my_error_handler'));
因为你必须告诉错误处理程序它是你想要调用的类方法(意图是set_error_handler(array(&$this, ‘method’))
),而不仅仅是一个函数(意为set_error_handler(‘function’)
的意思)
答案 2 :(得分:0)