EasySwoole WebSocket异常处理

EasySwoole的WebSocket服务默认没有异常处理,所以如果请求的class或action不存在,则服务端直接抛出异常并断开连接。这当然是不能接受的。

EasySwoole的WebSocket异常不同于HTTP异常,所以在EasySwooleEvent中的initialize方法中添加类似如下代码是不管用的:

Di::getInstance()->set(SysConst::HTTP_EXCEPTION_HANDLER,[ExceptionHandler::class, 'http_service_handle']);

这个异常处理只适用于HTTP,而不适用于WebSocket。

如果你的WebSocket服务是建立在官方的示例上的,则可以按下面的方法处理。

首先,在App/Services目录下新建一个ExceptionHandler.php,内容如下

<?php
namespace App\Services;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;

/**
 * 异常处理
 * Class ExceptionHandler
 * @package App\Services
 */
class ExceptionHandler
{
    /**
     * Http 服务未捕获的异常
     * @param \Throwable $exception
     * @param Request $request
     * @param Response $response
     */
    public static function http_service_handle( \Throwable $exception, Request $request, Response $response )
    {
        /**
         * 处理Http 未捕获异常
         */
        //TODO
    }

    /**
     * Socket 服务未捕获的异常
     * @param \Throwable $exception
     */
    public static function socket_service_handle($server, \Throwable $exception, $data,$client,$response)
    {
        /**
         * 处理Socket 未捕获异常
         */
        //TODO
    }
}

EasySwooleEvent中,先添加对上面类的引用,

use App\Services\ExceptionHandler;

再在mainServerCreate方法中,找到

$conf->setParser(new WebSocketParser());

在它下面添加一行代码:

$conf->setOnExceptionHandler([ExceptionHandler::class , 'socket_service_handle']);

重新启动EasySwoole服务即可。

写到这里,不得不说,EasySwoole的坑不少是官方挖的,官方的文档有时看的没头没尾,他们给出的Socket的两个demo居然连easyswoole文件都没有,用法和代码都不太对得上,所以没有一定的编程功力还是不要用EasySwoole了,不然满满的坑。

Leave a Comment

豫ICP备19001387号-1