前言
背景
在某些时候,我们会遇到一个安全,私有的无需注册、即开即用的沟通工具的情况。而市面上现成解决方案要么功能过重,要么受限于部署条件。我希望:
- 零数据库依赖——哪怕只有
php -S
也能跑。 - 前端零依赖——纯 JS + 少量 CSS,实现自适应深色主题。
- 支持阅后即焚、自毁计时等“轻隐私”特性。
技术栈
本项目保持极简:
- 后端: PHP(无框架),以
json
文件持久化消息与在线状态。 - 前端: HTML + CSS + 原生 JavaScript,轮询 + 差量渲染确保实时体验。
- 部署: 任意支持 PHP 7+ 的共享主机 / 轻量云服务器。
关键特性
当前版本已实现以下功能:
- 匿名登录(昵称即身份,免注册)
- 实时消息刷新
- 在线用户统计与列表
- 已读计数
- 自毁消息:定时删除 & 阅后即焚
- 深色响应式 UI
设计与实现
1. 文件存储而非数据库
相比 MySQL,JSON 文件更轻量,也更易备份。结合 flock
锁避免写冲突;定时 cleanup_messages.php
清理过期数据。
2. 差量轮询 & DOM Targeting
为了减少带宽消耗,我在前端仅请求 最新时间戳 之后的消息;并利用 dataset 锚点,精准更新已读计数,避免整屏重绘。
3. 自毁逻辑
每条消息可携带两种 TTL:
expires_at
:定时自毁burn_after_read
:阅后多少秒删除
后端在 send.php
& read.php
中写入 / 处理,并由 cleanup_messages.php
做兜底清理。
开发里程碑
实现实时“已读”计数、区分系统消息及 UI 优化
完成自毁消息 UI,更新 README,并修复移动端横向滚动问题
部署与本地运行
- 克隆仓库:
git clone https://github.com/zhuchenyu2008/Chatroom.git
- 赋权:
chmod 666 messages.json online.json
(仅开发环境,生产请收紧权限) - 启动:
php -S 0.0.0.0:8080
,浏览器访问http://localhost:8080/index.php
(端口随意)
遇到的问题与解决方案
- 并发写入冲突: 通过
flock
保证原子写;高并发场景计划引入 SQLite。 - 移动端输入体验: 针对软键盘遮挡问题,动态调整
viewport
与滚动。 - 消息跳动: 精准更新 DOM 节点而非重绘列表,配合
scrollIntoView()
平滑滚动。
未来计划
- WebSocket / SSE 替换轮询
- 可选 Docker 部署
- 消息加密 & 简易“阅后留痕”追踪
最后
感谢你读到这里!如果这个项目对你有帮助,欢迎 Star 支持,或提 Issue/Pull Request 一起共建。
发表回复