⭐️ Redis 内存爆满 / 优化 PHP 代码 / SVG 音频波形动画

2024-04-13

上午无意间打开了下自己的微信小程序,发现首页报错“接口数据异常”,用电脑打开对应 API 之后发现是 Redis 出现问题报错 OOM command not allowed when used memory > 'maxmemory',导致 PHP 打印出错误信息的字符串了(敲重点)。

那么这个时候就有两个问题需要解决了,首先是如何修复 Redis 的这个错误,其次是如何在代码中捕获错误,让 PHP 不再以字符串的形式打印错误。

第一个问题大概就是内存满了,默认只有 122M,我看了下其实存的大多数都是「网易云 API」的数据,网上查了一波资料给的建议就是切换数据淘汰算法,删除一些不常使用的数据,这里我选用的是 LFU,删除最不常用的,扩展就不考虑了,毕竟服务器本身内存就小...

vim /usr/local/redis/etc/redis.conf

:/maxmemory
maxmemory-policy allkeys-lfu
:wq

redis-cli shutdown

第二个问题我是使用了 PHP 的 set_exception_handler 函数解决的,函数本身接受一个参数为 Exception 对象的函数,只要 echo 包含错误信息的 JSON,在接口的相关位置调用一下就可以了,就是这代码写的有点烂吧,在这里不做详细讨论了。

解决完问题之后打算给前端做一些细节功能,想到之前 @Innei 给当前播放的歌曲做了一个进度条的效果,遂考虑加入一个展示“正在播放该歌曲”的效果。由于此前的播放按钮使用了 SVG + 伪元素的形式插入(因为那个编号也是 CSS 伪元素做的),于是想着能不能做一个动态的 SVG 并且插入进去。

最后就整了一个这样的 Demo,但是发现经过 SVGO 压缩后 rect 标签被压缩成 path 标签,导致该动画失效,发了个 吐槽,目前还没找到 Nuxt 打包层面可以解决的办法... 不经过打包器的话就只能放在 public 目录下,感觉怪怪的。

We Believe In You 多云 一般
概览页 时间轴
奇趣音乐盒 技术源于 Kico Player
Emmm,这里是歌词君