当前位置: 首页 > 科技观察

php使用tcp长连接的一种优化思路

时间:2023-03-13 14:33:25 科技观察

1.针对人群如果站点架构满足以下几点,那么本文的优化方案将非常适合:1)使用php等脚本语言作为开发语言2)需要连接后端服务,如RPC服务,memcache或者redis等3)流量非常大2,需要解决的问题常见的web架构如上:1)前端是APP还是网页2)服务器上层是web-server,用于访问3)PHP脚本语言调用后端数据,完成业务逻辑,拼接页面4)***端是服务,缓存,和数据库。PHP是一种脚本语言。不像C++/Java,进程可以常驻,所以它连接到后端服务。使用短连接:上图是一个典型的场景。站点php部署在A机器上,缓存memcache部署在B机器上,它们之间的通信是通过短连接。过程是:1)PHP建立tcp短连接2)根据memcache协议发送数据3)接收memcache返回的数据4)在php中关闭tc??p短连接当站点流量较小时,以上过程没有问题。当站点流量很大,QPS很高时,php为memcache建立tcp+关闭tcpshort连接开销不容忽视,有可能成为性能瓶颈。如何优化它是本文的核心。3.UNIXDomainSocket简介我们先来看看UNIXDomainSocket技术。UNIXDomainSocket是一种进程间IPC通信机制。它不需要经过网络协议栈、打包和解包、计算校验和、维护序列号和回复等,而只是将应用层数据从一个进程复制到另一个进程。.可以用于同一台主机上的两个不相关的进程,并且是全双工的,提供了可靠消息传递的IPC机制(消息不丢失,不重复,不混淆)。4、优化方案可以看出UNIXDomainSocket的效率比tcp短连接高很多,但是只能用于同一主机之间的进程通信,经常部署php应用和后端服务在不同的机器上可以,这个时候可以用来优化吗?答案是肯定的。优化后的简化结构图如上,在php应用服务器上部署了一个local-proxy,php和local-proxy之间使用UNIXDomainSocket通信,local-proxy通过TCPlong与后端服务通信连接,大大提高了通信效率,消除了每次请求建立+关闭tcp短连接的开销。5.local-proxy的实现要点要实现上述优化方案,local-proxy是实现的要点。实现local-proxy时,有几点需要注意:1)协议设计:local-proxy本身没有任何业务逻辑,只负责请求转发,上游发送memcache协议透传到后端内存缓存。在这种情况下,上游客户端不需要修改任何代码。2)通信方式:上面提到local-proxy使用UNIXDomainSocket与upstream通信,下游使用tcp长连接进行通信3)高效框架:该方案是为了解决tcp短连接的效率损失,所以对local-proxy的效率要求很高,可以选择成熟高效的网络框架(如libevent)和tcp4)请求映射:需要将上游发送的请求映射到本端发送的请求一个一个下游,从而正确对应请求包和响应包。师之道”