当前位置: 首页 > news >正文

【Yii2】Yii2框架的一次BUG排查

因为项目需要,最近学习了使用Yii2框架的使用。但毕竟刚上手,好多地方都不清楚。所以就有了这个博客。

1、需求

有这么一个需求:

后台需要访问用户的一个界面。为了界面不出问题,需要传递一个真实存在的Token。但对这个Token没有任何限制。

这里就偷了个懒,毕竟Token没有任何的限制。因此,直接访问了Token库,并从中读取一个数据。读取完成后就直接发给前端了。

UsersToken::find()->one()['token'];

毕竟不是什么大需求,经过测试后没有问题就这么上线了。

2、 问题

明明测试环境没问题的

但问题来了。上线后接口反而由于某种原因报错了。报错倒是简单,没有任何的报错信息,而是直接返回504。

这实在不正常。由于项目配置好了错误处理,一旦报错,必然能返回错误响应。只要有错误响应,自然能够排查出问题。

经过一番排查无果,选择向运维大哥要一下报错日志。结果得到了这个:

Allow memory size of 526385152 bytes exhausted (tried to allocate 4096 bytes) in xxx/xxxxx/xxx/xxxxxx...

大致内容看懂了,内存爆了: (

仔细查看代码,其他的执行条件没有任何问题。而Token的查询也很简单,不是很像有能力出问题的样子。所以陷入了某种僵局。

3、排查

查了种种资料没能看到一个解决方法~~(废话,这么弱智的问题竟然还要查资料 )~~。后来不得以翻了翻源码。最终在one()方法中找到了这么一句话:

Executes query and returns a single row of result.

执行查询,并返回结果的第一条。

初见端倪。继续深入源码,翻到了执行的部分:
在这里插入图片描述

可以看到,在执行过程中,实际上是先执行了查询语句select * from user_token,得到了数组result。之后返回数组的第一条数据,也就是result[0]

4、原因

迎刃而解。由于在构建查询语句时,没有加上相应的限制。因此,将user_token表中的全部数据写入到了内存中。由于测试环境的数据比较少,因此没有出现问题。但正式环境中数据很多,超过了内存限制,这才出现了BUG。坑爹啊

5、解决

最后手动加上了限制,问题解决。

UsersToken::find()->limit(1)->one()['token'];

相关文章:

  • 第十天 Shader编程:编写简单表面着色器 Addressable资源管理系统 DOTS(面向数据技术栈)入门
  • 给git配置SSH(github,gitee)
  • Android 智能家居开发:串口是什么,为什么android版本都比较低?粘包半包的原因以及处理思路,缓冲区处理,以及超时清空缓冲区....
  • C++开发之设计模式
  • 中小企业技术跃迁:云原生后端如何实现高效低成本系统建设
  • Java:XML被自动转义
  • 【软件设计师】模拟题一
  • 面试题:Redis 一次性获取大量Key的风险及优化方案
  • R 语言科研绘图第 41 期 --- 桑基图-基础
  • Redis 及其在系统设计中的作用
  • 【docker】 pull FROM build
  • Dash框架深度解析:数据驱动型Web应用的Python化革命
  • 前端基础之《Vue(9)—混入》
  • Linux 命令行与 vi/vim 编辑器完全指南
  • JetBrains GoLang IDE无限重置试用期,适用最新2025版
  • std::deque的简化源码详解
  • 架构-数据库系统
  • Java基础集合 面试经典八股总结 [连载ing]
  • Java开发工具IntelliJ IDEA v2025.1——全面支持Java 24、整合AI
  • C++内存管理那些事
  • 福建两名厅级干部履新,张文胜已任省委省直机关工委副书记
  • 金正恩视察重要坦克厂并强调更迭陆军装备
  • 上千游客深夜滞留张家界大喊退票?景区:已采取措施限制人流量
  • 传奇落幕!波波维奇卸任马刺队主教练,转型全职球队总裁
  • 一代名伶程砚秋经典影像:一箱旧影,芳华满堂
  • 谢震业领衔挑战世界顶尖高手,这场长三角田径钻石赛值得期待