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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云解析 DNS,旗舰版 1个月
简介: 关于使用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官网图

image.png

在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该反思的

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3天前
|
数据库连接 PHP 数据库
【YashanDB知识库】PHP使用ODBC使用数据库绑定参数功能异常
【YashanDB知识库】PHP使用ODBC使用数据库绑定参数功能异常
|
3天前
|
PHP 数据库
【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常
【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常
|
5天前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
102 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
2月前
|
运维 JavaScript 应用服务中间件
os-copilot安装与多项功能测评,帮助开发人员PHP环境排查问题
本文介绍了OS Copilot在ECS上 Alibaba Cloud Linux的安装与使用,并对其多项参数进行了功能测评。OS Copilot是为操作系统提供智能化辅助的工具,支持自动化任务、智能推荐、故障排查等功能。安装时需检查是否已安装(`rpm -q os-copilot`),若未安装则用`yum install os-copilot`命令安装,并配置AccessKey信息连接阿里云服务。通过测试不同参数命令,如`-t`参数,展示了其自动化执行和智能生成回答的能力,显著提升运维效率。
os-copilot安装与多项功能测评,帮助开发人员PHP环境排查问题
|
3月前
|
移动开发 小程序 前端开发
使用php开发圈子系统特点,如何获取圈子系统源码,社交圈子运营以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP 小程序 H5
开发一个圈子系统(也称为社交网络或社群系统)可以是一个复杂但非常有趣的项目。以下是一些关键特点和步骤,帮助你理解如何开发、获取源码以及运营一个圈子系统。
205 4
|
4月前
|
JavaScript PHP
17 PHP 实现批量删除功能
路老师在本文中继续优化图书删除功能,实现批量删除图书。通过添加删除按钮、表格前的复选框以及实现PHP后端逻辑,展示了完整的删除流程和效果。
66 5
|
4月前
|
JavaScript PHP UED
16 PHP实现图书删除功能
路老师在知乎上分享了PHP语言的知识,帮助大家入门和深入了解PHP。本文介绍了如何实现图书删除功能,通过点击删除按钮触发`deleteBook.php`文件,完成删除操作并返回列表页。同时,还新增了一个“新增”按钮,优化了用户体验。
43 2
16 PHP实现图书删除功能
|
4月前
|
数据库连接 PHP
15 PHP实现图书修改功能
路老师分享了如何使用PHP实现图书信息的修改功能。首先,在列表页面点击编辑按钮,跳转至`editBook.php`,通过ID获取图书信息并展示在`edit.html`页面。用户提交修改后,`updateBook.php`处理更新请求,成功后返回到图书列表页。纯干货,技术知识满满。
48 2
|
4月前
|
PHP
14 PHP实现图书添加功能
路老师分享PHP语言知识,帮助大家入门并深入了解PHP。本文介绍如何实现图书添加功能,包括创建HTML表单和PHP后端处理逻辑,最后展示实际效果。
54 2
|
5月前
|
NoSQL 安全 Linux
MongoDB PHP 扩展
10月更文挑战第19天
30 0
MongoDB PHP 扩展

热门文章

最新文章