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