function errorHandler($errno, $errstr, $errfile, $errline, $errcontext) { if (!(error_reporting() & $errno)) { // This error code is not included in error_reporting return; } ob_start(); switch ($errno) { case E_USER_ERROR: ob_start(); echo "USER ERROR: {$errstr}\n"; echo " Fatal error on line {$errline} in file {$errfile}"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")\n"; echo "Aborting...\n"; break; case E_USER_WARNING: echo "USER WARNING: {$errstr}<br />\n"; break; case E_USER_NOTICE: echo "USER NOTICE: {$errstr}<br />\n"; break; default: $errorType = friendlyErrorType($errno); echo ("" !== $errorType ? "{$errorType}: " : "Unknown error type: ") . "{$errstr} {$errfile} {$errline}\n"; break; } $error = ob_get_clean(); $bt = debug_backtrace(); $formatter = new LogFormatter(); $callstack = ''; foreach ($bt as $key => $caller) { if (0 === $key) { continue; } $callstack .= " -> "; if (isset($caller['class'])) { $callstack .= $caller['class'] . '::'; } $callstack .= $caller['function'] . '(' . $formatter->args($caller['args']) . ')'; $callstack .= "\n"; } $os = 'OS: ' . php_uname() . "\n"; $error = "\n\n " . $os . "\n" . $error . "\n" . print_r($errcontext, true) . " Callstack: \n" . $callstack . "\n\n"; header("HTTP/1.1 400 Request failed"); exit($error); /* Don't execute PHP internal error handler */ return true; }