企业微信网站怎么建设,网站运营条件,怎么把百度到自己的网站,网站外连因为项目需要#xff0c;最近学习了使用Yii2框架的使用。但毕竟刚上手#xff0c;好多地方都不清楚。所以就有了这个博客。
1、需求
有这么一个需求#xff1a;
后台需要访问用户的一个界面。为了界面不出问题#xff0c;需要传递一个真实存在的Token。但对这个Token没有…因为项目需要最近学习了使用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];