专栏首页仙士可博客关于使用php理论实现swoole扩展的功能

关于使用php理论实现swoole扩展的功能

最近swoole在php中越来越知名,很多人说swoole给与了php的新生,有swoole的php可以和node js,go等语言抗衡,那么,我们从技术角度来说,swoole到底实现了什么,如果没有php,就实现不了协程,多进程等功能吗? 到底是php语言有问题?还是各大phper有问题?

swoole

首先我们了解下swoole究竟是什么东西:

PHP的协程高性能网络通信引擎,使用C/C++语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端/客户端。

根据swoole介绍,已经文档说明的功能,我将swoole大概实现的功能大致列出:

 1:tcp服务器,http服务器,websocket服务器,redis 服务器

 2:udp服务器

 3:协程管理,协程异步IO监听

 4:内存操作管理

 5:多进程管理,多进程通信,进程信号监听

 6:异步任务管理

 7:tcp,udp客户端

 8:http,http2,mysql,redis等协程客户端

 9:定时器

在后面,我们将一个个讲解,如何使用php实现功能.

tcp服务器/udp服务器

tcp/udp服务器其实php使用socket函数,即可创建一个tcp服务器了,我之前也写过类似文章:php实现socket网络编程

首先,我们从swoole实现tcp/udp的具体架构说起:

 tcp服务器模型

swoole官网图

在php中,pcntl扩展可支持多进程,但是不支持多线程,我们如果需要实现的话,只能把线程改为进程,通过php进程通信-消息队列

进行进程通信

 I/O复用模型

swoole采用了4种I/O模型(epoll,kqueue,select,poll),根据操作系统的不同而选择不同的模型

在php中,我们可通过安装libevent扩展,socket_select函数等方法实现I/O复用

通过php的socket扩展+I/O复用可实现tcp服务器,再通过消息队列等进程通信方法,实现多进程的tcp服务器

tcp/udp服务器是swoole的核心,http,websocket等服务器都是基于tcp实现

难点:

1:多进程通信

2:I/O复用

3:tcp粘包处理

4:超时断线处理

http服务器

在上面,我们已经通过php实现了tcp服务器,http作为tcp的子协议,只要我们在tcp接收逻辑中,解析http头,进行响应的处理,并发送规定的http响应头即可

难点:

1:http协议非常多,只能做简单的get,post等协议解析,其他交给nginx服务器

2:解析post等数据

websocket服务器

websocket服务器继承http以及tcp,同样,只需要解析好握手时的协议头即可

难点:

1:websocket握手机制需要了解

协程

在协程方面,我们可直接通过yield实现协程php yield关键字以及协程的实现

难点:

1:封装一个完善的协程框架

2:需要增加一个异步I/O的监听管理,与协程管理通信,使其能够自动监听I/O完成,然后恢复协程

内存管理

关于内存管理方面,本人并不是很熟悉,只知道shmop扩展可实现php的共享内存

多进程

使用pcntl扩展可实现多进程,进程信号,通过pipe,消息队列等方法可实现进程通信

异步任务管理

通过pcntl创建异步task任务,然后worker进程通过进程通信将任务传递给task即可

tcp,udp客户端

通过socket扩展即可实现:http://www.php20.cn/article/162

协程客户端

大家都知道,mysql,redis等在php中通信都是基于tcp的,我们可通过tcp非阻塞客户端+通信协议实现异步的客户端

再通过协程的模块,实现yield并监听I/O,I/O到了之后恢复协程状态

定时器

通过pcntl_alarm 函数进行定时发起进程信号,再然后实现回调即可实现定时器

技术总结

由上面可知道,php是可基本实现swoole的大部分功能的,具体总结如下:

 1:多进程,进程通信方面,进程信号,pipe管道通信,消息队列,共享内存都可实现

 2:网络编程,socket扩展+libeventI/O复用即可实现

 3:协程,I/O自动切换协程,通过yield关键字,socket设置非阻塞,即可实现协程并在I/O耗时时切换协程

 4:异步任务可由1实现

总结

swoole通过php扩展实现,优势是非常大的,例如自动切换协程,内置函数的hook等.

写这篇文章只是想让自己,和大家更加了解swoole到底实现了什么,php到底是不是最好的语言(手动滑稽)

抛弃swoole,我们php本身内置的扩展已经可以让我们做很多事情,但是除了workerman,又有哪些知名的php socket框架呢?在swoole之前,为什么没人提起过协程化编程呢?这是我们作为phper该反思的

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • php连接mysql数据库详细步骤(图文)

    mysql 是一款广受欢迎的数据库,由于它是开源的半商业软件,所以市场占有率高,备受php开发者的青睐,一直被认为是php的最佳搭档。同时php也具有强大的数据...

    叫我可儿呀
  • 性能测试-Jmeter工具介绍

    1.测试计划(test plan)---描述一个性能测试,包含本次测试所有相关功能

    用户6367961
  • [PHP] 循环查看php-fpm的内存占用情况

    在webmail的业务中进行发信,如果携带了附件,会把附件拼接内嵌到邮件正文里,这时会极大的占用内存,可以使用以下命令查看fpm的进程内存占用

    陶士涵
  • Python实用技巧大任务切分

    今天来说说,Python 中的任务切分。以爬虫为例,从一个存 url 的 txt 文件中,读取其内容,我们会获取一个 url 列表。我们把这一个 url 列表称...

    用户1564362
  • 让自动化工作流解放你的双手

    相信很多小伙伴和我目前的现状是一样的,公司的前端部署测试和上线都是通过人工去操作,当我们本地开发完成之后,在本地进行打包,然后将打包后的 dist 文件上传到服...

    石燕平
  • web前端开发可以从事哪些工作

    随着互联网进几年来的高速发展,web前端这一门技术和对应的行业岗位就应运而生。Web前端主要就是网站的页面展现以及动态交互部分,比如大家逛淘宝所看到的页面就是w...

    千锋哈尔滨IT培训
  • 内存崩溃了?其实你只需要换一种方式

    使用 JDK 自带的 Set 集合来进行 URL 去重,看上去效果不错,但是这种做法有一个致命了缺陷,就是随着采集的 URL 增多,你需要的内存越来越大,最终会...

    Java_老男孩
  • 怒薅羊毛:白嫖GitHub作为个人博客免费图床

    很多小伙伴私信反馈说,个人博客搭建完以后,写文章时,图片上传和存放成了一个问题。我看很多人都把图片放在仓库一起,然后试图通过相对路径的方式来引用图片,结果很多人...

    AI算法与图像处理
  • php配置redis拓展流程与redis的使用

    开发架构二三事
  • [PHP] pmap可以查看进程占用内存的详细情况

    while true;do clear;date;for i in `ps --no-headers -o "pid" -C php-fpm`;do pmap...

    陶士涵

扫码关注云+社区

领取腾讯云代金券