捕获Server运行期致命错误

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

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

register_shutdown_function('handleFatal');

function handleFatal()
{
    $error = error_get_last();
    switch ($error['type'] ?? null) {
        case E_ERROR :
        case E_PARSE :
        case E_CORE_ERROR :
        case E_COMPILE_ERROR :
            $message = $error['message'] . PHP_EOL;
            if (isset($_SERVER['REQUEST_URI'])) {
                $message .= '[QUERY] ' . $_SERVER['REQUEST_URI'];
            }
            // log or send:
            // error_log($message);
            // $server->send($fd, $message);
            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里面的例子都实现不了

  • 瞪灯蹬

    swoole的官方到底看不看评论的,这个问题很久了,都没有解决呀~~~~,PHP7根本就没触发register_shutdown_function,浪费多少人时间精力了

  • rtsg

    register_shutdown_function 这个注册函数在什么地方使用? 一下是代码

    use Swoole\Http\Server; include_once "testSwoole_swoole_last_error.php"; $http = new Server("0.0.0.0", 9501); $http->on('request', function ($request, $response) {

    include_once "123.php";// 里面有语句错误
    $response->end("Hello Swoole. #".rand(1000, 9999)."");
    

    }); $http->start();

  • rtsg

    use Swoole\Http\Server; include_once "testSwoole_swoole_last_error.php"; $http = new Server("0.0.0.0", 9501); $http->on('request', function ($request, $response) {

    include_once "123.php";// 里面有语句错误
    $response->end("Hello Swoole. #".rand(1000, 9999)."");
    

    }); $http->start();

    以上是代码 register_shutdown_function 这个函数放在哪里 可以正常的触发相关的方法

  • rtsg

    Swoole\Http\Server->on("request",function(){ 无法使用 error_get_last 方法 获取本函数的错误 })