用PHP构建高性能的TCP/UDP服务器

本文介绍了如何使用PHP构建高性能的TCP和UDP服务器,通过中间层提高安全性和性能,避免直接连接数据库的风险。文章详细阐述了TCP服务器的架构,包括master、listener和worker进程,以及使用socketpair和UNIX域socket的通信机制。对于UDP服务器,文章提到了使用msgqueue作为通信媒介。同时,讨论了进程身份改变、CPU亲和性和负载均衡等问题,以及解决惊群问题的方法。
摘要由CSDN通过智能技术生成

如果web server直连db,那么当web server被攻破以后,黑客可以在代码中找到db的用户名和密码,可能会造成被拖库的危险。并且对于db来说,其连接数是有上限的,当多个cgi都需要连接db的时候很有可能会因为db连接数达到上限而拒绝服务。因此在webserver和db之间增加一个中间层变得很必要,中间层和db是保持长连接的。当有数据请求时,web server和中间层server用私有协议(非SQL)来交互,从而提高安全性和性能。这就是中间层server的雏形。

随着web业务的不断多样化,中间层server的作用已经远远不止转发db数据这么简单,它已经提供完整的TCP和UDP服务。下面就介绍一下架构。

1. TCP Server

与大多数server的架构类似,整个TCP server由master进程,Listener进程和worker进程组成。master进程负责监听信号和listener/worker进程的健康状况,在进程意外终止时将其重新拉起。Listener进程负责hold住客户端的连接,而worker进程来做真正的业务逻辑。由于listener只是简单地负责路由和转包,不涉及任何阻塞的调用,所以总是不会被阻塞。listener和worker之间选用unix域socket作为通信机制,由于通信被限定在亲戚进程之间,所以我们选取了无名unix域socket的一种实现--socketpair来完成这件事情。

一般来说listener的数量要小于worker的数量,为了便于绘图和描述,在下面这个例子当中,我们假定listener数量为2,worker数量为5。

1.1 Master进程

当服务启动时,首先由当前进程(master进程)

  • 创建worker数量(5个)的socketpair,放在静态变量中(用于发包给worker)
  • 创建listener数量(2个)的socketpair,放在静态变量中(用于从worker收包)
  • 创建一个网络socket,bind,listen用于和用户间的通信


接下来就是fork()啦,同时有些细节问题需要处理

  • 改变子进程的身份
  • 打开子进程的CPU亲和选项

由于所有的socket是放在静态变量里面的,即master进程的数据段,因此fork()以后,在子进程中依然可以访问这些socket。也正是因为这些socket在多个进程之间两两配对,使得listener和worker可以实现通信。

unix域socket是用于同一台机器上运行时进程间的通信,虽然它和INET域socket被封装成了同样的接口,但是内部实现完全不一样。其仅仅复制数据,并不执行协议处理,不需要添加和删除网络报头,计算检验和,产生顺序号,发送确认报文等等因此其效率更高。unix域socket提供了TCP和UDP两种接口,我们应该选用哪一种呢?当然是UDP了,作为无连接状态的协议,不需要保留连接态,这样可以做到纯异步。但问题是UDP协议会不会导致丢包呢?是不是不保证顺序呢?答案是不会,原因很明显,unix域socket是基于管道实现的,因此是可靠的,既不会丢失消息,也不会传递出错。

现在进程结构变成了这样


master进程到此就完成了初始化的工作,它接下来就进入了监听信号和处理信号的主循环当中。其主要作用就是监控所有子进程的健康状态,做出相应地处理,并且接收系统信号便于处理管理员的reload,restart,stop和上报运行状态等需求,同时,master可以动态的配置子进程的个数(TODO)。


如果发现子进程状态发生变化(SIGCHLD),则将其重新拉起,如果是系统的退出信号,则设置标志位,待其他信号都处理好以后再平滑的退出。

1.2 Listener和Worker进程

由于所有的listener和worker都是master进程的子进程,拥有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值