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

简介: 如果站点架构满足以下几点,那么本文的优化方案会非常适合:

一、面向人群

如果站点架构满足以下几点,那么本文的优化方案会非常适合:
1)使用php等脚本语言作为开发语言
2)需要连接后端服务,例如RPC服务、memcache或redis等
3)流量非常大

二、解决的问题

image.png

常见的web架构如上:
1)最前端是APP或者web页面
2)服务器上层是web-server进行接入
3)php脚本语言调用后端数据,完成业务逻辑,拼接页面
4)最后端是服务、缓存、数据库
php是一种脚本语言,不像C++/Java那样进程能够常驻,所以它连接后端的服务都是使用短连接:

image.png

上图是一种典型场景,站点php部署在机器A上,缓存memcache部署在机器B上,之间通过短连接通信,过程为:
1)php建立tcp短连接
2)按照memcache协议发送数据
3)接收memcache返回的数据
4)php关闭tcp短连接
在站点流量小时,上述过程没有任何问题,当站点流量非常大,QPS很高的情况下,php对memcache的tcp建立+关闭tcp短连接的开销便不能忽略了,有可能成为性能的瓶颈,如何进行优化是本文即将讨论的核心。

三、UNIX Domain Socket介绍

话锋一转,先一起来看看UNIX Domain Socket技术。
UNIX Domain Socket是一种进程间IPC通讯机制,它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。它可以用于同一台主机上两个没有亲缘关系的进程,并且是全双工的,提供可靠消息传递(消息不丢失、不重复、不错乱)的IPC机制。

四、优化方案

可以看到,UNIX Domain Socket的效率会远高于tcp短连接,但它只能用于同一台主机间的进程通讯,而php应用和后端服务往往是部署在不同的机器上的,此时能否利用它来进行优化呢,答案是肯定的。
image.png

优化后的简易架构图如上,在php应用服务器上部署一个local-proxy,php与local-proxy之间使用UNIX Domain Socket来通讯,而local-proxy与后端服务进行TCP长连接通讯,这样就大大提升了通讯效率,免除了每次请求都要进行的建立+关闭tcp短连接的开销。

五、local-proxy要点

要实现上述优化方案,local-proxy是实现要点,在实现local-proxy时,有这么几点需要注意
1)协议设计:local-proxy本身没有任何业务逻辑,只负责请求转发,上游发送过来memcache协议,透传给后端的memcache,这样的话,上游客户端不需要进行任何代码的修改
2)通讯方式:如上文所述,local-proxy与上游使用UNIX Domain Socket进行通讯,与下游使用tcp长连接进行通信
3)高效框架:这种方案是为了解决tcp短连接的效率损耗,这样对local-proxy的效率要求就非常高,可以选用成熟高效的网络框架(例如libevent)和tcp长连接连接池技术来实现
4)请求映射:需要将上游发过来的请求与发往下游的请求一一映射起来,这样才能正确的对应上请求包与响应包

==【完】==

image.png

目录
相关文章
|
16天前
|
缓存 PHP 开发者
PHP中的自动加载机制及其优化方法
传统的PHP开发中,经常会遇到类文件加载繁琐、效率低下的情况,而PHP的自动加载机制能够很好地解决这一问题。本文将深入探讨PHP中的自动加载机制,介绍其原理及实现方式,并提出了一些优化方法,帮助开发者提升代码加载效率,提高应用性能。
|
28天前
|
SQL 缓存 PHP
PHP技术探究:优化数据库查询效率的实用方法
本文将深入探讨PHP中优化数据库查询效率的实用方法,包括索引优化、SQL语句优化以及缓存机制的应用。通过合理的优化策略和技巧,可以显著提升系统性能,提高用户体验,是PHP开发者不容忽视的重要议题。
|
25天前
|
运维 Linux Apache
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
197 2
|
2月前
|
缓存 NoSQL PHP
百度搜索:蓝易云【如何使用PHP进行数据库索引优化?】
通过以上方法,你可以使用PHP进行数据库索引优化,提高数据库查询性能和整体应用性能。同时,定期维护数据库和优化查询语句也是保持数据库高性能的关键。
42 11
|
9月前
|
缓存 负载均衡 监控
php开发中大数据量优化的问题总结(1):smarty循环优化、API掉包丢失数据排查、负载平衡配置
php开发中大数据量优化的问题总结(1):smarty循环优化、API掉包丢失数据排查、负载平衡配置
115 0
|
9月前
|
SQL JSON 关系型数据库
php执行语句在MySQL批量插入大数据量的解决方案及计算程序执行时间(大数据量、MySQL语句优化)
php执行语句在MySQL批量插入大数据量的解决方案及计算程序执行时间(大数据量、MySQL语句优化)
195 1
|
9月前
|
关系型数据库 MySQL PHP
lockdatav-API在开发过程中php和mysql语法的优化方案
lockdatav-API在开发过程中php和mysql语法的优化方案
52 0
|
9月前
|
关系型数据库 MySQL PHP
php使用webSocket实现Echarts长连接自动刷新的解决方案(3):获取读取数据库数据队列进行实时刷新
php使用webSocket实现Echarts长连接自动刷新的解决方案(3):获取读取数据库数据队列进行实时刷新
122 0
|
9月前
|
JSON 关系型数据库 MySQL
php使用webSocket实现Echarts长连接自动刷新的解决方案(2):后端服务端代码返回json数据
php使用webSocket实现Echarts长连接自动刷新的解决方案(2):后端服务端代码返回json数据
113 0