捕获Server运行期致命错误

Server运行期一旦发生致命错误,那客户端连接将无法得到回应。如Web服务器,如果有致命错误应当向客户端发送Http 500 错误信息。

在PHP中可以通过register_shutdown_function + error_get_last 2个函数来捕获致命错误,并将错误信息发送给客户端连接。具体代码示例如下:

register_shutdown_function('handleFatal');
function handleFatal()
{
    $error = error_get_last();
    if (isset($error['type']))
    {
        switch ($error['type'])
        {
        case E_ERROR :
        case E_PARSE :
        case E_CORE_ERROR :
        case E_COMPILE_ERROR :
            $message = $error['message'];
            $file = $error['file'];
            $line = $error['line'];
            $log = "$message ($file:$line)\nStack trace:\n";
            $trace = debug_backtrace();
            foreach ($trace as $i => $t)
            {
                if (!isset($t['file']))
                {
                    $t['file'] = 'unknown';
                }
                if (!isset($t['line']))
                {
                    $t['line'] = 0;
                }
                if (!isset($t['function']))
                {
                    $t['function'] = 'unknown';
                }
                $log .= "#$i {$t['file']}({$t['line']}): ";
                if (isset($t['object']) and is_object($t['object']))
                {
                    $log .= get_class($t['object']) . '->';
                }
                $log .= "{$t['function']}()\n";
            }
            if (isset($_SERVER['REQUEST_URI']))
            {
                $log .= '[QUERY] ' . $_SERVER['REQUEST_URI'];
            }
            error_log($log);
            $serv->send($this->currentFd, $log);
        default:
            break;
        }
    }
}


  • 涂海

    bucuo

  • 夏向红

    $serv是从哪里冒出来的

  • 路过的小新

    同问$serv是从哪里冒出来的

  • DrLosAngeles

    就是人家记录日志的一个方法而已,无关紧要

  • juzi-xxy

    这个要放哪里,怎么放都没写日志

  • -HXCH--

    代码不全,应该是参数传递进来的

  • 晕头转向

    $serv = new swoole_server("0.0.0.0", 9501);

  • 武继孔

    涂师傅好

  • zerovszero

    这个案例谁做好了,可否共享一下

  • zerovszero

    哈哈,不用了,直接在事件回调的地方调用register_shutdown_function('handleFatal',$serv,$fd); 将handleFatal函数里面的$this->currentFd 换成$fd就可以了

  • S
    S

    php7 + swoole 都没有回调

  • zhao

    这个在哪注册?如果在request事件里调用,那么只要有一个请求崩溃,其他所有未返回的请求都会崩溃。

  • 勉g

    是php7的问题吗,试了好久没完成过,用example里面的例子都实现不了