一种基于PHP处理高并发IO的方法技术

技术编号:23342968 阅读:22 留言:0更新日期:2020-02-15 03:45
本发明专利技术公开了一种基于PHP处理高并发IO的方法,包括:Swoole根据配置创建单个或者多个进程;Master进程创建N个Reactor线程;在每个Reactor线程中创建协程;通过协程调度异步处理IO任务。本发明专利技术使用Swoole模型,通过多线程Reactor模型(基于epoll)加上多进程Worker,在每个线程创建协程,通过协程调度异步处理IO任务,即当遇上IO耗时的情况时,通过协程调度去先处理其他代码逻辑,直到IO完成再继续执行之前的代码;充分利用系统资源,减少IO阻塞等待和系统资源的浪费,也大大提升了高并发下的IO处理能力,可以解决Accept性能瓶颈和惊群问题。

A method of processing high concurrent IO based on PHP

【技术实现步骤摘要】
一种基于PHP处理高并发IO的方法
本专利技术涉及高并发IO处理
,具体涉及一种基于PHP处理高并发IO的方法。
技术介绍
高并发它通常是指同时并行处理很多请求,它是分布式系统架构设计中必须考虑的因素之一。当系统对请求做出响应的时间过大,就会大大降低互联网产品的用户体验度。在互联网时代,高并发通常是指并发访问,也就是在某个时间点,有多少个访问同时到来。通常一个系统的日PV在千万以上,有可能是一个高并发的系统。目前在并发IO的解决方案中最多的是使用IO复用技术,Linux很早就提供了select系统调用,可以在一个进程内维持1024个连接。后来又加入了poll系统调用,poll做了一些改进,解决了1024限制的问题,可以维持任意数量的连接。但select/poll还存在一个问题:select/poll需要循环检测连接是否有事件。此时,如果服务器有100万个连接,在某一时间只有一个连接向服务器发送了数据,select/poll需要做循环100万次,其中只有1次是命中的,剩下的999999次都是无效的,白白浪费了CPU资源。直到Linux2.6内核提供了新的epoll系统调用,可以维持无限数量的连接,而且无需轮询,这才真正解决了C10K问题。现在各种高并发异步IO的服务器程序都是基于epoll实现的,比如Nginx、Node.js、Erlang、Golang。像Node.js这样单进程单线程的程序,都可以维持超过1百万TCP连接,全部归功于epoll技术。
技术实现思路
对上述问题中存在的不足之处,本专利技术提供一种基于PHP处理高并发IO的方法。本专利技术公开了一种基于PHP处理高并发IO的方法,包括:Swoole根据配置创建单个或者多个进程;将当前进程作为Master进程,所述Master进程创建N个Reactor线程;在每个Reactor线程中创建协程;通过协程调度异步处理IO任务。作为本专利技术的进一步改进,N由配置的reactor_num、worker_num和CPU核心数目共同决定。作为本专利技术的进一步改进,每个所述Reactor线程中运行一个Reactor对象;所述Reactor线程,用于接收来自客户端发送的数据、发送来自服务器的响应数据和处理Swoole定时器事件。作为本专利技术的进一步改进,所述在每个Reactor线程中创建协程,包括:每个Reactor线程在接收到客户端的请求时,通过swoole的Go函数创建一个协程。作为本专利技术的进一步改进,所述通过协程调度异步处理IO任务,包括:协程中遇到IO阻塞,协程让出控制,进入协程调度队列,对阻塞任务进行异步处理。与现有技术相比,本专利技术的有益效果为:本专利技术使用Swoole模型,通过多线程Reactor模型(基于epoll)加上多进程Worker,在每个线程创建协程,通过协程调度异步处理IO任务,即当遇上IO耗时的情况时,通过协程调度去先处理其他代码逻辑,直到IO完成再继续执行之前的代码;充分利用系统资源,减少IO阻塞等待和系统资源的浪费,也大大提升了高并发下的IO处理能力,可以解决Accept性能瓶颈和惊群问题。附图说明图1为本专利技术一种实施例公开的基于PHP处理高并发IO的方法的流程图;图2为本专利技术一种实施例公开的Reactor模型图;图3为本专利技术一种实施例公开的协程调度的流程图。具体实施方式为使本专利技术实施例的目的、技术方案和优点更加清楚,下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本专利技术的一部分实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本专利技术保护的范围。下面结合附图对本专利技术做进一步的详细描述:Swoole:面向生产环境的PHP异步网络通信引擎。协程:是异步IOReactor模型,应用层自行实现了任务调度,借助Reactor切换各个当前执行的用户态线程。本专利技术提供一种基于PHP处理高并发IO的方法,通过Reactor模型(基于epoll)加上多进程Worker,通过协程调度异步处理IO任务,高效的处理高并发情况下的IO任务;包括:如图1所示,本专利技术提供一种基于PHP处理高并发IO的方法,包括:S1、Swoole根据配置可创建单个或者多个进程;每个进程里面都会有一个Master进程和若干个子进程;S2、将当前进程作为Master进程,Master进程创建N个Reactor线程;具体为:当启动SwooleServer时,Master进程会创建N个Reactor线程,N由实际配置选项reactor_num、worker_num和CPU实际核心数目共同决定;每个Reactor线程中运行一个Reactor对象;Reactor线程,用于接收来自客户端发送的数据、发送来自服务器的响应数据和处理Swoole定时器事件。进一步,如图2所示,Reactor模型有4个核心的操作:Add添加socket监听到reactor,可以是listensocket也可以使客户端socket,也可以是管道、eventfd、信号等Set修改事件监听,可以设置监听的类型,如可读、可写。可读很好理解,对于listensocket就是有新客户端连接到来了需要accept。对于客户端连接就是收到数据,需要recv。一个SOCKET是有缓存区的,如果要向客户端连接发送2M的数据,一次性是发不出去的,操作系统默认TCP缓存区只有256K。一次性只能发256K,缓存区满了之后send就会返回EAGAIN错误。这时候就要监听可写事件,在纯异步的编程中,必须去监听可写才能保证send操作是完全非阻塞的。Del从reactor中移除,不再监听事件Callback就是事件发生后对应的处理逻辑,一般在add/set时制定。S2、在每个Reactor线程中创建协程;具体为:每个Reactor线程在接收到客户端的请求时,通过swoole的Go函数创建一个协程。S3、通过协程调度异步处理IO任务;具体为:协程中遇到IO阻塞,协程让出控制,进入协程调度队列,对阻塞任务进行异步处理,减少IO阻塞导致的时间损失。如图3所示,协程调度的方法包括:1)、创建Tsak并传入协程;2)、调用run方法;3)、Scheduler循环调度;4)、调度返回值类型;5)、返回值类型为Tsak_Continue,则返回步骤3);返回值类型为Tsak_Wait,进行异步执行;执行完毕,则返回步骤3);返回值类型为Tsak_Done,跳至步骤6);6)、结束。实施例:线程和进程的本文档来自技高网...

【技术保护点】
1.一种基于PHP处理高并发IO的方法,其特征在于,包括:/nSwoole根据配置创建单个或者多个进程;/n将当前进程作为Master进程,所述Master进程创建N个Reactor线程;/n在每个Reactor线程中创建协程;/n通过协程调度异步处理IO任务。/n

【技术特征摘要】
1.一种基于PHP处理高并发IO的方法,其特征在于,包括:
Swoole根据配置创建单个或者多个进程;
将当前进程作为Master进程,所述Master进程创建N个Reactor线程;
在每个Reactor线程中创建协程;
通过协程调度异步处理IO任务。


2.如权利要求1所述的方法,其特征在于,N由配置的reactor_num、worker_num和CPU核心数目共同决定。


3.如权利要求1所述的方法,其特征在于,每个所述Reactor线程中运行一个R...

【专利技术属性】
技术研发人员:鲁曦
申请(专利权)人:武汉智美互联科技有限公司
类型:发明
国别省市:湖北;42

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1