分享一个玩具,把 PHP 的 http 请求变为长连接,能有效降低请求的延迟

2023-09-05 22:58:03 +08:00
 pretty66

Fastcar - PHP HTTP 长连接代理

背景

公司的一个 php 项目经常调用众多的三方平台的 api ,有 http 协议和 https 协议;由于 php-fpm 模式无法复用链接,所以每次进行 api 调用时需要经过:tcp 握手、( tls 握手)、http 报文交互、连接关闭几个阶段;比较明显的就是接口延迟高,业务量大时出现大量的 TIME_WAIT 。

解决

使用 go 语言开发了一个网络请求代理中间件,接管 php 的网络请求,在代理程序中保持连接的复用;经测试能极大的降低网络延迟,目前已在生产环境使用。

测试百度翻译 api 的 http 和 https 请求延迟

Fastcar 原理简介

开源地址

最后

如果项目采用微服务架构,且包括由 PHP 开发的微服务,而这些微服务之间通过 HTTP 进行调用,那么可以使用 Fastcar 作为 PHP 的网络请求中间件。能有效地维持长连接,降低资源开销,以及减少网络延迟。

2342 次点击
所在节点    程序员
37 条回复
mrpzx001
2023-09-06 15:35:50 +08:00
workerman/swoole 能干这事吗?
pretty66
2023-09-06 16:36:12 +08:00
@mrpzx001 可以,但是项目用 workerman/swoole 这种架构重构,费时费力
changz
2023-09-06 18:24:24 +08:00
@pretty66 三行代码是少,耐不住服务数量多啊,你一个一个改?还不如在出口网关做代理,内网 tcp 握手效率一般还没到需要优化的时候
pretty66
2023-09-06 18:40:20 +08:00
@changz 出口网关? hook dns 流量到网关,然后如何做代理转发流量,你在代理这一层针对 https 类型的地址,你如何复用连接,是否会涉及到自签证书体系的管理,如果引入这一套东西这个架构的复杂度提升了不是一星半点。如果不包含自建证书体系,是否可以详细说说你的架构流程
learningman
2023-09-06 19:48:00 +08:00
确实是玩具
changz
2023-09-06 20:46:10 +08:00
@pretty66 确实复杂,然而很多开源的组件例如 envoy 已经能做到这一点了
pretty66
2023-09-06 21:39:23 +08:00
@changz service mesh 体系小公司用起来也费劲的,envoy 和阿里的 mosn 这种 sidecar 主要用来解决的是微服务间的调用对 http 的支持很友好,针对调用第三方平台 api 特别是 https 是没办法支持连接复用的,可以看下 istio 的说明: https://istio.io/v1.8/zh/docs/tasks/traffic-management/egress/egress-control/#access-an-external-https-service
vibbow
2023-09-07 09:50:43 +08:00
@demoshengxw php 连接 redis/mysql
地址前面加 p: 就是长连接模式
demoshengxw
2023-09-07 22:58:11 +08:00
@vibbow 但是 fpm 模式下,长链接意义不大。执行完毕还是会释放,所以找个代理维持和 redis 的链接是个好的方案。
vibbow
2023-09-08 03:57:06 +08:00
@demoshengxw 大哥,你不看回帖的么...
fpm 模式下,长链接 是跨请求存在的
shoaly
2023-09-11 23:49:05 +08:00
@pretty66 挺好的一个思路, 一个小二美的东西
pretty66
2023-09-12 09:55:28 +08:00
@shoaly 感谢认可🤝
shoaly
2023-09-13 08:45:03 +08:00
@pretty66 其实老哥这个项目的尴尬是 , php 和 go 一般人都是 2 选 1, 不喜欢缝合, 我个人倒是也喜欢缝合在一起用, php 的效率和随意 + go 的一些网络请求的优势
pretty66
2023-09-13 10:25:35 +08:00
@shoaly 是的,多语言借助各自的优势相互配合能极大的提高效率;这个只是给有需要的人,还有一种针对老项目需要优化但是又不想重构的用这个比较方便。这个目前我们已经上线使用了,效果很不错,而且从开发到上线只用了一天
shoaly
2023-09-13 19:07:46 +08:00
@pretty66 只需要改一下 通用的请求方法, 或者不行就全盘搜索 curl , 理论上 也没几处
dandankele
360 天前
@vibbow 有个问题,长连接是不是也需要服务端的支持?如果服务端在每次处理完成请求之后主动断开连接(例如对方服务端接口也是没使用长连接的常规的 php 实现的接口),即使客户端支持长连接,也无法维持这个长连接是吗?
vibbow
360 天前
@dandankele 对于服务器端,长连接实际上不是 PHP 处理的,而是 apache/nginx 这些处理的,一般都是支持的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/971229

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX