加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

php-msf源码详解

发布时间:2021-04-02 09:14:27 所属栏目:编程 来源:网络整理
导读:我们来看分享下详细源码: 源码解读也做了一段时刻了,总结一下本身的心得: 抓住 生命周期,让代码在你脑海中 跑起来 说明架构,要害字 分层 界线 断绝 一个好的框架,弄清晰 生命周期 和 架构,根基就已经到了 认识 的状态了,之后是添补细节和编码纯熟了 这里再

swoole 自己是实现了断绝的:

on('request',$response) { $response->end("

Hello Swoole. #".rand(1000,9999)."

"); }); $http->start();

msf 在 Context 上还做了一层封装,让 Context 看起来 随心所欲:

getContext()->xxxModule->xxxModuleFunction();

细节可以查察 src/Helpers/Context.php 文件

工具池

工具池这个观念,各人也许较量生疏,目标是镌汰工具的频仍建设与烧毁,以此来晋升机能,msf 做了很好的封装,行使很简朴:

getObject(DemoModel::class,[1,2]);

工具池的详细代码在 src/Base/Pool.php 下:

底层行使反射来实现工具的动态建设

if (!$poolName) {
return null;
}

$pool = $this->map[$poolName] ?? null;
if ($pool == null) {
$pool = $this->applyNewPool($poolName);
}

if ($pool->count()) {
$obj = $pool->shift();
$obj->__isConstruct = false;
return $obj;
} else {
// 行使反射
$reflector = new ReflectionClass($poolName);
$obj = $reflector->newInstanceWithoutConstructor();

$obj->__useCount  = 0;
$obj->__genTime  = time();
$obj->__isConstruct = false;
$obj->__DSLevel  = Macro::DS_PUBLIC;
unset($reflector);
return $obj;

}
}

行使 SplStack 来打点工具

map)) { throw new Exception('the name is exists in pool map'); } $this->map[$poolName] = new SplStack();

return $this->map[$poolName];
}
// 打点工具
$pool->push($classInstance);
$obj = $pool->shift();

毗连池 & 署理

毗连池 Pools

毗连池的观念就不赘述了,我们来直接看 msf 中的实现,代码在 src/Pools/AsynPool.php 下:

callBacks = []; $this->commands = new SplQueue(); $this->pool = new SplQueue(); $this->config = $config; }

这里行使的 SplQueue 来打点毗连和必要执行的呼吁. 可以和上面比拟一下,想一想为什么一个行使 SplStack,一个行使 SplQueue.

署理 Proxy

署理是在毗连池的基本长进一步的封装,msf 提供了 2 种封装方法:

主从 master slave

集群 cluster

查察示例 AppControllersRedis 中的代码:

getRedisPool('p1')->set('key1','val1'); $val = yield $this->getRedisPool('p1')->get('key1');
$this->outputJson($val);

}
// Redis署理行使示例(漫衍式)
public function actionProxySetGet()
{
for ($i = 0; $i <= 100; $i++) {
yield $this->getRedisProxy('cluster')->set('proxy' . $i,$i);
}
$val = yield $this->getRedisProxy('cluster')->get('proxy22');
$this->outputJson($val);
}

// Redis署理行使示例(主从)
public function actionMaserSlaveSetGet()
{
for ($i = 0; $i <= 100; $i++) {
yield $this->getRedisProxy('master_slave')->set('M' . $i,$i);
}

$val = yield $this->getRedisProxy('master_slave')->get('M66');
$this->outputJson($val);

}
}

署理就是在毗连池的基本长进一步 搞工作. 以 主从 模式为例:

主从计策: 读主库,写从库 署理做的工作:

判定是读操纵照旧写操纵,选择响应的库去执行 民众库

msf 奉行 民众库 的做法,但愿差异成果组件可以做到 可插拔,这一点可以看 laravel 框架和 symfony 框架,都由框架焦点加一个个的 package 构成. 这种头脑我长短常保举的,可是细心看 百度脑图 - php-msf 源码解读 这张图的话,就会发明类与类之间的依靠相关,分层/界线 做得并欠好. 假如看过我之前的 blog - laravel源码解读 / blog - yii源码解读,举办比拟就会感觉很明明.

可是,这并不料味着 代码欠好,至少成果正常的代码,险些都能算是好代码. 从成果之外成立的 良好感,更多的是对 柔美糊口的憧憬 -- 还可以更好一点.

AOP

php AOP 扩展: http://pecl.php.net/package/aop

PHP-AOP扩展先容 | rango: http://rango.swoole.com/archives/83

AOP,面向切面编程,韩老大 的 blog - PHP-AOP扩展先容 | rango 可以看看.

需不必要相识一个新事物,先看看这个事物有什么浸染:

AOP,将营业代码和营业无关的代码举办疏散,场景有 日记记录 / 机能统计 / 安详节制 / 事宜处理赏罚 / 非常处理赏罚 / 缓存 等等. 这里引用一段 措施员DD - 翟永超的公家号 文章里的代码,让各人感觉下:

同样是 CRUD,不行使 AOP

delete(long id,String lang) { Map data = new HashMap(); boolean result = false; try { // 说话(中英文提醒差异) Locale local = "zh".equalsIgnoreCase(lang) ? Locale.CHINESE : Locale.ENGLISH; result = configService.delete(id,local); data.put("code",0); } catch (CheckException e) { // 参数等校验堕落,这类非常属于已知非常,不必要打印仓库,返回码为-1 data.put("code",-1); data.put("msg",e.getMessage()); } catch (Exception e) { // 其他未知非常,必要打印仓库说明用,返回码为99 log.error(e);

data.put("code",99);
data.put("msg",e.toString());
}
data.put("result",result);
return data;
}

行使 AOP

delete(long id) { return new ResultBean(configService.delete(id)); }

代码只用一行,必要的特征一个没少,你是不是也想写这样的 CRUD 代码?

设置文件打点

先明晰一下设置打点的痛点:

是否支撑热更新,常驻内存必要思量

思量差异情形: dev test production

利便行使

热更着实可以算是常驻内存处事器的整体需求,今朝 php 常用的办理方案是 inotify,可以参考我之前的 blog - swoft 源码解读 .

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读