表单提交前用$_SESSION缓存用户输入数据,需在提交后、验证失败前缓存,验证通过且入库成功后清空;敏感字段不缓存,加时间戳防陈旧;APCu缓存表单结构,键名带版本号;用$_SESSION['form_token']防重复提交,random_bytes生成并立即unset;缓存失效需同步清理$_SESSION、APCu和localStorage三层。

表单提交前用 $_SESSION 缓存用户输入数据
用户填完一半表单就刷新或误点返回,重填体验极差。PHP 本身不自动保存表单状态,必须手动把 $_POST 或 $_GET 数据暂存到 $_SESSION 中,下次访问同一表单页时读取并填充字段。
关键点:缓存时机在表单提交后、验证失败前;清空时机在验证通过且数据入库成功后。
- 务必在
session_start()后再操作$_SESSION,否则报错Cannot send session cache limiter - 不要缓存敏感字段(如密码、银行卡号),可用白名单过滤:
['name', 'email', 'phone'] - 建议加时间戳标记缓存生成时间,超 30 分钟自动丢弃,避免陈旧数据干扰
用 apcu_store() 缓存表单结构和校验规则
如果表单字段多、校验逻辑复杂(比如动态字段、条件必填),每次请求都解析 JSON 配置或查数据库会拖慢响应。把表单定义数组(含字段名、类型、规则)用 apcu_store() 存内存,比文件或 DB 快一个数量级。
注意 APCu 是进程级缓存,重启 PHP-FPM 后失效,适合开发/中小流量场景;高并发建议换 Redis。
立即学习“PHP免费学习笔记(深入)”;
- 键名建议带版本号,如
'form_config_v2_signup',避免规则更新后缓存不生效 - 值必须是可序列化的数组,不能含资源、闭包或
$this - 用
apcu_exists()先判断再取,避免未命中时触发警告
防止重复提交:用 $_SESSION['form_token'] + 隐藏域校验
用户手抖连点“提交”按钮,后端可能收到两条相同请求,造成重复写库。这不是纯前端防抖能解决的——浏览器关闭再重开、新标签页仍可能复用旧 token。
XYCMS建站系统PHP版非MVC框架,自己手写原生态普通代码,作为企业用,已经绰绰有余。软件运行效率中等,加入数据缓存后性能提高。假如用来学习,下载可以慢慢研究的,假如用来建站,可以选择购买商业版就行建站用。栏目类别:文章,人员信息,专题项目,招聘,下载,相册,单页【支持无限极分类】文章:可用作添加新闻,资讯,列表信息类栏目信息人员信息:可用作企业员工信息栏目内容添加或者维护专题项目:可用作企业
标准做法是服务端生成唯一 token,存 $_SESSION 并输出到表单隐藏域;提交时比对且立即销毁该 token。
- token 必须用
random_bytes(32)生成,别用md5(time())这类可预测值 - 销毁 token 要用
unset($_SESSION['form_token']),不是设为null—— 后者仍会被isset()判为 true - 若需支持“后退再提交”,得改用数据库记录 token 状态(已用/未用),但会增加 IO
缓存失效要分层处理:$_SESSION 清理 ≠ APCu 清理 ≠ 前端 localStorage
用户修改了表单配置(比如新增字段),你清了 $_SESSION,但前端 JS 还从 localStorage 读旧字段名,或者 APCu 里还存着老规则,结果页面错乱、校验失灵。
真正要同步清理的有三层:
-
$_SESSION:用户级临时数据,随登录态存在,登出或超时自动清 - APCu:全局配置缓存,更新配置后需显式
apcu_delete('key')或用apcu_clear_cache()(慎用,影响所有缓存) - 前端
localStorage:需在 PHP 输出页面时注入 JS 清除指令,或让前端监听配置版本号变化
最易被忽略的是第三层:没人告诉浏览器“表单结构变了”,它就永远用着上次存的字段列表。










