当前位置:首页 > 默认分类 > 正文内容

【PHP】大量 HTTP 请求调第三方接口,接口堵塞引起的 FD 耗尽(too many file open)问题

virtualman4个月前 (07-13)默认分类857

“FD耗尽”中的“FD”指的是“文件描述符”(File Descriptor)。在Unix和类Unix系统(如Linux)中,文件描述符是一个非负整数,用于标识一个进程打开的文件或其他输入/输出资源,比如网络套接字(sockets)。

当发起大量的HTTP请求,尤其是如果这些请求是同步阻塞的,并且第三方接口响应时间较长,那么每个未完成的请求都会占用一个文件描述符。如果系统中可用的文件描述符数量有限,而消耗的速度超过了释放的速度,最终就会达到系统的上限,导致“FD耗尽”的情况。通常表现为“Too many open files”之类的错误信息。

为了避免这种情况,可以采取以下措施:

  1. 使用异步或非阻塞的IO模型,这样多个请求可以共享较少的文件描述符。
  2. 增加系统的最大文件描述符限制(通常通过调整/proc/sys/fs/file-max或修改ulimit -n设置)。
  3. 实现请求的限流或排队机制,避免短时间内发送过多请求。
  4. 优化第三方接口的响应时间,或者使用缓存策略减少直接调用的频率。
  5. 正确地关闭不再需要的连接,确保文件描述符得到及时释放。

对于第1种解决方案,传统上PHP并不支持异步编程,尤其是在脚本模式下运行时,它默认是同步阻塞的。不过,随着技术的发展,PHP也有了一些异步解决方案,比如使用Swoole或ReactPHP这样的扩展库,它们能够提供异步I/O和协程的支持,允许你在PHP中编写非阻塞代码。

在我们项目中,采用了对外部接口限流的方法来解决的。并调整了系统和PHP的最大文件数量。同时也降低了curl的超时时间和请求超时时间。

相关文章

【动态规划】基础背包问题

  1159. 背包问题一 (Standard IO) 时间限制: 1000 ms  空间限制: 262144 KB  具体限制   题目描述 有个背包可承受重量N,现有T件物品每件物品重量为...

【NOIP初赛 】哈夫曼树

【NOIP初赛 】哈夫曼树

根据我已刷的初赛题中基本每套的倒数第五或第六个不定项选择题就有一个关于哈夫曼树及其各种应用的题,占:0—1.5分;然而我针对这个类型的题也多次不会做,so,今晚好好研究下哈夫曼树;  概念:  给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二...

【vue】vue3实现表格(JSON)数据导出Excel

【vue】vue3实现表格(JSON)数据导出Excel

首先安装xlsx依赖npm install xlsx --save项目中引入import * as XLSX from "xlsx";此方法纯导出数据,没有其他设置,对导出的Excel表格没有要求时可...

【CSS】设置div底部边框阴影

div{       -webkit-box-shadow:0px 1px 1px #de1dde;       -moz-box-shadow:...

【疑难杂症】记录一次定位并修复涉及支付、转账的系统性BUG

【疑难杂症】记录一次定位并修复涉及支付、转账的系统性BUG

在某个线上的项目上,突然收到用户反馈,存在转账连续转两次的情况。一开始接到反款后并没有太在意,因为这个项目已经在线上稳定运行了近两年的时间,期间也并没有对订单或者支付系统进行修改。支付的接口也没有发生变化,因此,第一次反馈认为是一次用户的误报。但是,今天下午,有个开发者用户给我再一次反馈了这个BUG...

跑在内存中的数据库——H2数据库

跑在内存中的数据库——H2数据库

今天接触到了一个非常有意思的数据库,叫H2数据库。在众多数据库中,H2数据库以其独特的特性——内存数据库模式,吸引了大量开发者的关注。今天,就来深入探讨一下这个跑在内存中的数据库——H2数据库。 一、H2数据库简介 H2是一个轻量级的关系型数据库,它支持嵌入式和客户...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。