kizumi_header_banner_img

欢迎您的访问~

文章导读

悄悄话不求人!在线聊天室的诞生:PHP + MySQL 全栈实践


avatar
yuan 2026年8月19日 21

一个聊天室的诞生:PHP + MySQL 全栈实录

依旧“作案动机”

说实话,QQ和微信这两个“老大哥”已经很好用了。但用得越久,越觉得有些地方不对劲:

  • 群聊消息刷得飞快,重要内容眨眼就被淹没,想往回翻根本找不到
  • 群是别人建的,规则是平台定的,你永远是个“客人”
  • 说封就封、说删就删,数据从来不在自己手里

我想要一个自己说了算的聊天地方——数据在自己数据库里,功能自己定,规则自己设,朋友拉进来就能聊。

就这么简单。

一个目标一场梦

最初的想法很朴素:

  • 能注册、能登录,每人一个唯一UID
  • 有个公共大厅,谁进来都能说话
  • 能加好友、能私聊、能建群
  • 想“潜水”的时候能隐身

但做着做着就收不住了——功能像滚雪球一样越滚越大:

聊天的基本盘:

  • 好友系统:按UID/用户名搜索、好友申请、备注、置顶、黑名单
  • 私聊:文字/图片/文件、表情、消息撤回、引用回复、转发、输入状态提示、草稿箱、导出聊天记录
  • 群聊:建群、邀请入群(带审核)、群公告、@成员、群主管理(移除/转让/解散)

不止是聊天:

  • 通知中心:好友申请、入群邀请、@提及、系统公告,未读数角标、标签页标题闪烁
  • 全站搜索:大厅、私聊、群聊一起搜,标注来源还能定位高亮
  • 管理后台:用户/消息/群组管理、公告、反馈、日志、数据备份
  • 邮件系统:SMTP发信、注册邮箱验证、找回密码

说白了就是:把“聊天”这件小事,做成一个自己能完全掌控的小社区

技术选型:为什么是 PHP + MySQL

我手头那几台空闲的虚拟主机依旧空闲,不上班工作怎么行呢?而它们都支持PHP + MySQL,上传就能跑,不用装任何环境。

  • PHP:虚拟主机标配,上传即用,零配置
  • MySQL:聊天系统是多用户、高并发场景,读多写多,MySQL比SQLite更稳

前端我也没碰任何框架——纯原生JavaScript,没有npm、没有webpack、没有外部依赖。用户拿到代码要做的就三步:导入chat.sql → 改config.php里的数据库账号 → 访问首页自动建管理员。

纯原生,开箱即用。

项目长什么鸟样

text

ychat/

├── index.php              # 主界面(大厅 + 聊天)

├── login.php / register.php / logout.php

├── forgot_password.php / reset_password.php / verify_email.php

├── profile.php / change_password.php

├── config.php             # 全局配置

├── functions.php          # 公共函数库(含SMTP发送)

├── chat.sql               # 数据库结构(18张表)

├── api/                   # 49个AJAX接口

├── admin/                 # 管理后台

├── uploads/               # 上传目录(含防执行.htaccess)

├── assets/                # 静态资源

├── css/                   # 样式文件

└── js/                    # 前端逻辑

几个关键设计

没有WebSocket,怎么“实时”聊天?

我的虚拟主机不支持长连接(哭),WebSocket基本不用想。我用的是最朴素的AJAX轮询:

  • 前台每4秒拉一次新消息
  • 每15秒刷新会话列表、在线用户、大厅禁言状态
  • 每30秒再刷一次在线用户

还有个优化:标签页隐藏时自动暂停轮询(document.hidden === false才拉数据),切走不浪费流量,切回来立刻续上。免费主机跑起来毫无压力。

在线状态和隐身模式

在线判断靠“心跳”:用户每次操作更新last_active时间戳,最近5分钟内有动作就算在线。

隐身模式是后加的:顶栏一键切“在线/隐身”。隐身时visible=0,前台的大厅、好友列表、群成员统统不显示你在线——但后台管理仍然按真实状态统计。瞒得住好友,瞒不住管理员。

群公告的设计

群公告不能只发一条普通消息——会被刷屏顶没。我的做法是:公告内容持久化存在groups表的announcement字段里,发布后在群聊顶部显示常驻横幅、资料面板里也能看,同时以一条带完整内容的通知推送给全体成员。

自定义确认弹窗

移除群成员、转让群主、解散群……这些都是危险操作。浏览器原生confirm()太丑,而且跟整个毛玻璃UI格格不入。我全部换成了屏幕中央的自定义弹窗——统一风格、有主次按钮、还能跟页面主题联动。

安全方面

聊天系统最怕被人搞,安全上花了不少心思:

  • 预处理语句(mysqli prepared statements)防SQL注入,有用吗我也不知道
  • htmlspecialchars统一转义防XSS
  • CSRF Token:前端请求头 + 表单隐藏字段双保险
  • 上传目录放.htaccess禁止执行PHP,头像用GD库重绘,图片/文件校验真实类型
  • 登录失败5次锁定15分钟,Session 24小时超时

消息撤回 / 引用 / 转发

私聊消息2分钟内可撤回,支持引用回复、转发到其他会话,还有“对方正在输入…”的输入状态提示。这些小交互单个看都不起眼,但凑在一起体验就完整很多。

邮件系统

后台可以配置SMTP(QQ、163、Gmail都支持,SSL/TLS/无加密三种方式),配好还能一键“发送测试邮件”验证。可以选择是否开启“注册邮箱验证”,而开了“注册邮箱验证”后,注册必须填邮箱、点验证链接才能登录;忘记密码也走同一条通道。

这东西能拿来干什么

  • 同学群、朋友小圈子的专属聊天室
  • 学习小组、项目组内部讨论空间
  • 自己搭一个“数据在自己手里”的聊天工具
  • 想系统练手PHP + MySQL全栈开发的学习项目

体验与开源

此项目依旧是开源项目

在线体验:https://china.uuk.pp.ua/(老样子,链接不定时失效,如无法打开则默认体验地址取消)

开源地址:HIWB/ychat: PHP + MySQL 在线聊天系统

本项目仅供学习交流使用,欢迎下载、学习、二次开发。

写在最后

从最开始的“想有个自己的聊天室”,到设计18张表、写49个接口、调轮询、磨UI、做后台、部署上线。功能不多,BUG不少——虚拟主机不认中文路径、PHP新版弃用GD函数、免费主机会拦文件名带“chat”的资源……一个紧接一个,也不乏许多能够令人忍俊不禁的问题(现在老绷带是也)

插入:什么,今天是七夕?我说群里怎么这么多小伙伴到处@询问是否在线,原来都是单身狗啊,那我就不上线,急死他们(笑)

再来一句:一室既成,万人可聚;数据在手,方寸自留。

最后,项目仍在持续完善中,如有帮助,不妨点个 ⭐ Star 支持一下。

 



评论(0)

查看评论列表

暂无评论


发表评论

博主信息

avatar

小源

一个平平无奇的大学牲

7
文章
3
评论
19
用户

陀飞轮

曾付出 几多心跳
来换取一堆堆的发票
人值得 命中减少几秒
多买一只表
秒速 捉得紧了
而皮肤竟偷偷松了
为何用到尽了
至知哪样紧要
记住那关于光阴的教训
回头走 天已暗
你献出了十寸时和分
可有换到十寸金
还剩低 几多心跳
人面跟水晶表面对照
连自己亦都分析不了
得到多与少
也许真的疯了
那个倒影 多麼可笑
灵魂若变卖了
上链也没心跳