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了,不然满满的坑。