版权声明:转载请注明来源 https://blog.csdn.net/u013702678/article/details/82728242
在分析TcpServer的分钟中可以看到,worker进程启动后的回调函数中,框架会创建一个对象来完成后续的网络数据读取和回复,从这篇开始我们就分析这个对象本身,这个对象就是FSOFProtocol类的对象,引用代码如下:
//autoload 用户的所有代码
$appRoot = AppAutoLoader::getFatherPath($appBootLoader, 1);
AppAutoLoader::addRoot($appRoot);
return new FSOFProtocol();
FSOFProtocol的代码位于dubbo-php-framework-master/provider/fsof/FSOFProtocol.php路径下,根据其继承体系,我们可以看到FSOFProtocol->BufferedProtocol->BaseProtocol->IProtocol,所以我们就从较简单的类开始分析。
//接口定义,这些具体的接口不做分析,后续真实用到的时候再讨论。
interface IProtocol
{
function setServer($server);
function getAppConfig();
function onStart($server, $workerId);
function onConnect($server, $client_id, $from_id);
function onReceive($server,$client_id, $from_id, $data, $reqInfo = null);
function onClose($server, $client_id, $from_id);
function onShutdown($server, $worker_id);
function onTask($serv, $task_id, $from_id, $data);
function onFinish($serv, $task_id, $data);
function onTimer($serv, $interval);
function onRequest($request, $response);
}
//BaseProtocol是对IProtocol的默认实现,这个框架作者应该是写Java出身,Java框架老搞这种事情,哈哈
abstract class BaseProtocol implements IProtocol
{
protected $server;
protected $swoole_server;
function __construct()
{
$this->init();
}
abstract public function init();
public function setServer($server)
{
$this->server = $server;
}
public function getAppConfig()
{
return $this->server->getAppConfig();
}
public function getAppName()
{
return $this->server->getAppName();
}
public function getAppRunTimeEnv()
{
return $this->server->getAppRunTimeEnv();
}
public function onStart($server, $workerId)
{
$this->swoole_server = $server;
//监控app重加载时间,监控相关的后续再分析
$this->server->getAppMonitor()->onAppReload();
\Logger::getLogger(__CLASS__)->debug("protocol onStart():{$workerId}");
}
public function onConnect($server, $fd, $fromId)
{
}
public function onReceive($server,$clientId, $fromId, $data, $reqInfo = null)
{
}
public function onClose($server, $fd, $fromId)
{
}
public function onShutdown($serv, $workerId)
{
}
public function onTask($serv, $taskId, $fromId, $data)
{
}
public function onFinish($serv, $taskId, $data)
{
}
public function onTimer($serv, $interval)
{
switch( $interval )
{
case FSOFConstants::FSOF_MONITOR_TIMER:
{
$this->server->getAppMonitor()->uploadMonitorData();
break;
}
}
}
public function onRequest($request, $response)
{
}
}
abstract class BufferedProtocol extends BaseProtocol
{
protected $requests;
const STATUS_FINISH = 1; //完成,进入处理流程
const STATUS_WAIT = 2; //等待数据
const STATUS_ERROR = 3; //错误,丢弃此包
public function onReceive($server, $clientId, $fromId, $data, $reqInfo = null)
{
// 检查buffer,当前的类里是抽象函数,应该会在具体子类里实现,这里使用了模板方法模式
$ret = $this->checkBuffer($clientId, $data);
\Logger::getLogger(__CLASS__)->debug("ret = ${ret}");
switch($ret)
{
case self::STATUS_ERROR://读取数据发生错误,这里丢弃,重新接收新包
unset($this->requests[$clientId]);
return true; // 错误的请求
case self::STATUS_WAIT:
return true; //数据不完整,继续等待
default:
break; // 完整数据
}
//读取请求信息,这里是有内存缓存
$request = $this->requests[$clientId];
if (!empty($reqInfo))//数据不为空
{
$request->reqInfo = $reqInfo;//设置请求的属性信息
}
$this->server->setRequest($request);
$this->onOneRequest($clientId, $request);//处理clientId的一次完整的请求信息
unset($this->requests[$clientId]);//清理内存
}
abstract public function checkBuffer($client_id, $data);
abstract public function onOneRequest($client_id, $request);
public function onClose($server, $fd, $fromId)
{
unset($this->requests[$fd]);
}
}