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);
}
Sign up to request clarification or add additional context in comments.

Comments

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 Comments

You should be able to handle a fatal error with register_shutdown_function()
@SebastiánGrignoli: There is no clean way to detect if there was an error in that function.
<?php function cleanup(){ print_r(error_get_last()); } register_shutdown_function("cleanup");asdfasdf();
I agree it's not 100% clean, but it's enough for logging the error, I think.
Re "It is not possible to handle fatal errors using a custom error handler.": Did it change with PHP 7 or not?
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 Comment

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

What does the strikeout for "base" mean? Is it an old revision? - can it be deleted? Or something else?
"All your base." Get it?
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 Comments

I have an error handler to handling my error but some error like above, I could not handle them or log.
Ugh, i'm pretty sure he wants a generic solution.
I do not know where this error happen. i need to log all type error
this answer dose not help me because i dont know where or when this error happen

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.