最近有朋友问:我在 OpenWrt 上搭了个内网直播页面,观众打赏后,前端能立刻显示新记录,但路由器管理后台的数据库却要等好几分钟才刷新——这算正常吗?
别被“路由”二字骗了
很多人默认路由器只管转发数据包,不碰业务逻辑。其实现在不少定制固件(比如 Padavan、OpenWrt + LuCI 插件)已经支持轻量级 Web 服务。你放个 PHP 脚本或 Node.js 小进程在 /www/ 下,配合 SQLite 或内存数据库,完全能跑一个简易打赏统计页。
问题出在“同步更新”四个字上。不是路由器做不到实时,而是默认没配——就像你家 WiFi 密码改了,手机不会自动重连,得手动刷新或等 DHCP 租期到期。
三个常见卡点,一一对症
1. 前端轮询太懒
有些页面用 30 秒 setInterval 拉一次 /api/rewards.json,看着是“实时”,其实滞后严重。改成 EventSource 或 WebSocket 更靠谱:
const evt = new EventSource('/stream/rewards');
evt.onmessage = (e) => {
const data = JSON.parse(e.data);
document.getElementById('count').innerText = data.total;
};2. 后端写完不通知
打赏成功后,PHP 脚本 insert 到 SQLite,但没触发任何广播。加一行 file_put_contents('/tmp/reward_update', time(), LOCK_EX) 就能让 Lua 脚本监听文件变更,再主动推送给前端。
3. 浏览器缓存耍滑头
Chrome 对 /api/ 接口缓存特别积极。加个时间戳参数或者响应头强制不缓存:
header('Cache-Control: no-cache, must-revalidate, max-age=0');实测小技巧
在 OpenWrt 的 /etc/rc.local 里加一句:logger -t 'reward-sync' 'Sync started at $(date)'
再配合 logread | grep reward-sync,哪次更新失败、延迟多久,一眼就清楚。不用翻日志文件,也不用装额外监控工具。
说白了,“打赏记录同步更新”不是玄学,就是前后端配合+一点系统级的小调度。路由器性能有限,但只要别硬塞 MySQL、Elasticsearch 这类重型组件,用好 SQLite WAL 模式 + 内存表 + 简单事件机制,百人并发下的秒级同步完全没问题。