dubbo-php-framework的Protocol解析(一)

版权声明:转载请注明来源 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]);
    }
}

猜你喜欢

转载自blog.csdn.net/u013702678/article/details/82728242
今日推荐