10

How can I log the following error to a text file or database?

Fatal error: Call to undefined method PROJECTS::ssss()

0

5 Answers 5

13

There is a way to cope with your task and actually you can set a custom error handler on fatal errors.

You can do it this way:

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);
}
12

It is not possible to handle fatal errors using a custom error handler.

The best solution is simply enabling error logging (e.g. to syslog) in your php.ini and then using a tool like logcheck/logsentry to receive regular emails about unusual syslog entries.
Instead of syslog PHP can also log errors to a file - simply have a look at the error logging options of php.ini.

log_errors = On
error_log = syslog
error_log = /path/to/some/folder/phperrors.log

Obviously you only want to use one of the error_log lines.

5
  • You should be able to handle a fatal error with register_shutdown_function() Commented Nov 2, 2012 at 20:55
  • @SebastiánGrignoli: There is no clean way to detect if there was an error in that function. Commented Nov 3, 2012 at 1:13
  • 5
    <?php function cleanup(){ print_r(error_get_last()); } register_shutdown_function("cleanup");asdfasdf(); Commented Nov 3, 2012 at 18:04
  • I agree it's not 100% clean, but it's enough for logging the error, I think. Commented Nov 5, 2012 at 13:25
  • Re "It is not possible to handle fatal errors using a custom error handler.": Did it change with PHP 7 or not? Commented Sep 18, 2021 at 11:47
8

Now in PHP 7 it is possible to catch fatal errors:

try {
    
    ggggg(); // <---- make a fatal error
    
} catch(Throwable $e) {
    
    var_dump($e);
    
}
1
  • 1
    In PHP 7 there's a new and very useful Throwable class, which finally uniforms errors and exceptions, but to implement it you must typecast the error/exception object to Throwable: try { ggggg(); } catch(\Throwable $e) { var_dump($e); }
    – yodabar
    Commented Jul 3, 2018 at 14:33
1

You could have all your base classes belong to a super-class utilizing method overloading:

class Base 
{
    public function __call($name)
    {
        MyLog::logError(...);
        trigger_error("Function ".get_class($this)."::$name doesn't exist", 
            E_USER_ERROR);
    }
}

Attempts to invoke non-existing methods of classes derived from Base would be ultimately handled by Base::__call(). For static methods, accordingly, there's __callStatic() (as of PHP 5.3).

2
  • What does the strikeout for "base" mean? Is it an old revision? - can it be deleted? Or something else? Commented Sep 18, 2021 at 11:44
  • "All your base." Get it? Commented Sep 19, 2021 at 16:23
0

Something like:

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

}
4
  • I have an error handler to handling my error but some error like above, I could not handle them or log.
    – Hamidreza
    Commented Feb 17, 2012 at 15:15
  • 1
    Ugh, i'm pretty sure he wants a generic solution. Commented Feb 17, 2012 at 15:15
  • 1
    I do not know where this error happen. i need to log all type error
    – Hamidreza
    Commented Feb 17, 2012 at 15:16
  • this answer dose not help me because i dont know where or when this error happen
    – Hamidreza
    Commented Feb 17, 2012 at 15:19

Not the answer you're looking for? Browse other questions tagged or ask your own question.