根据前面所介绍的知识点,我们已经学习如下:
- 面向对象
- 错误与异常处理
- 多进程
- 多 进程间通信
- 网络编程
等等知识内容.
那么本文,我们将尝试,如果是我们自己来设计与实现类似workerman的 socket 框架,该怎么办? 或者说,我们在设计与实现的过程中,会经历哪些思考?
这样,才能够去体验作者walkor的整个思路,也便于我们深入地阅读源码
1、原型设计
先从Workerman的框架定义出发:
Workerman是一款纯PHP开发的开源高性能的PHPsocket服务框架
1.1、关键词-“高性能”与”socket”
socket: 说明是网络通信,而根据之前的文章,php实现socket可以通过原生socket函数或者是stream库
高性能: 由于是socket通信,根据之前的文章,也能够知道高性能,在这里是指 IO 复用,而IO复用的实现显然是指select或 libevent 库/event库
1.2、原型图
根据对关键词的理解,我们就有了设计socket框架的思路。如下图所示:
2、原型设计改进
从上面的原型图中,可以看到。它是个单进程的设计方案。假设系统中没有安装event拓展,则在IO复用这块只能使用select,而select是有连接数的限制。因此引入”多进程”的方案
2.1、改进原型图-多进程
由于是多进程,因此需要考虑父子进程间的通信。如下图所示:
2.2、继续改进原型图
- 运行方式
我们实现的socket框架显然只能在cli进行执行。既然是cli,就必然要考虑守护进程运行的方式,否则 shell 终端被关闭,我们的程序也将跟着停止运行
- 信号监听
我们程序是守护进程的方式在后台执行,那怎么操作运行程序状态。显然是通过信号。这也说明了父子进程间的通信采用信号,而不是其它进程间的 通信方式 的原因
- cli执行参数解析
通过在cli执行时,传入参数,实现灵活的操作。因此需要命令行参数解析
- 传输层 处理封装
我们创建的socket默认是 tcp 或udp等传输层的操作,为了方便维护,需要封装传输层的处理
- 应用层协议封装
在传输层的基础上,如要处理常见http、websocket、或其它自定义协议。因此需要封装好应用层协议处理
2.3、最终版原型图
根据上面的思考,我们得到最终的设计图.如下图所示
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~