【发布时间】:2012-03-08 23:44:14
【问题描述】:
如何将以下错误记录到文本文件或数据库中?
致命错误:调用未定义的方法 PROJECTS::ssss()
【问题讨论】:
标签: php error-handling logging fatal-error
如何将以下错误记录到文本文件或数据库中?
致命错误:调用未定义的方法 PROJECTS::ssss()
【问题讨论】:
标签: php error-handling logging fatal-error
现在在 PHP 7 中,可能捕获致命错误:
try {
ggggg(); // <---- make a fatal error
} catch(Throwable $e) {
var_dump($e);
}
【讨论】:
Throwable 类,它最终统一了错误和异常,但要实现它,您必须将错误/异常对象类型转换为 Throwable:try { ggggg(); } catch(\Throwable $e) { var_dump($e); }
有一种方法可以处理您的任务,实际上您可以针对致命错误设置自定义错误处理程序。
你可以这样做:
ini_set('error_reporting', E_ERROR);
register_shutdown_function("fatal_handler");
function fatal_handler() {
$error = error_get_last();
// Do whatever you want with this error. For example:
YourDBApplicationLayer::writeFatal($error);
}
【讨论】:
不可能使用自定义错误处理程序来处理致命错误。
最好的解决方案是在您的 php.ini 中启用错误日志记录(例如记录到 syslog),然后使用 logcheck/logsentry 之类的工具定期接收有关异常 syslog 条目的电子邮件。
除了 syslog,PHP 还可以将错误记录到文件中 - 只需查看 php.ini 的错误记录选项。
log_errors = On
error_log = syslog
error_log = /path/to/some/folder/phperrors.log
显然您只想使用error_log 行之一。
【讨论】:
<?php function cleanup(){ print_r(error_get_last()); } register_shutdown_function("cleanup");asdfasdf();
你可以让你的所有 base classes 属于一个使用 method overloading 的超类:
class Base
{
public function __call($name)
{
MyLog::logError(...);
trigger_error("Function ".get_class($this)."::$name doesn't exist",
E_USER_ERROR);
}
}
尝试调用派生自Base 的类的不存在方法最终将由Base::__call() 处理。因此,对于静态方法,有 __callStatic()(从 PHP 5.3 开始)。
【讨论】:
类似:
if(!method_exists($obj, 'method')){
$db->log('What you want to log'); //log in your DB
error_log('message');//Write to php's error log
}
【讨论】: