phpcmsv9 上传图片后退出
phpcms v9有个毛病,传图后台传完图片,片后退出登录,退出再回来,传图图没了。片后准确说,退出是传图图片还在服务器上,但数据库里那条记录丢了。片后这事儿我踩过坑,退出折腾了半天,传图最后发现是片后session的锅。 流程是退出这样的:你登录后台,上传图片,传图phpcms会往session里塞一个临时变量,片后记录这个图片的退出id。然后你点退出,系统执行logout操作,顺手把session清空了。等你再登录,session是新的,那个图片id就找不到了。前台调用图片的时候,数据库里查不到对应记录,自然就显示不出来。 但诡异的是,如果你不退,直接刷新或者继续操作,图片就一直在。这问题只在“上传完马上退出”这个特定动作下触发。我一开始以为是权限问题,查了目录权限,改了chmod,没用。又以为是uploadfile函数有bug,打了补丁,还是没用。最后翻开phpcms的session处理代码,才发现它退出时用的是 session_destroy()这玩意儿太暴力了,直接把整个session文件删了。phpcms的附件表里有个字段叫 解决办法其实挺傻的。要么改退出逻辑,在destroy之前先手动把附件表的记录更新一下,把authcode置空,或者改成其他不会失效的标识。要么干脆别用它的退出按钮,直接关浏览器,session过期时间到了自动清,反而没事。我最后选了后者,顺手在后台模板里把退出链接换成了 这问题从phpcms v9.5.0一直存在到最后的更新版本,官方论坛里有人提过,但没人正经修。你搜“phpcms 上传图片 退出 丢失”,能搜出一堆求助帖,底下回复全是“清缓存”“换浏览器”这种废话。实际上就是session生命周期管理不当,跟图片本身没关系。 后来我干脆写了个小插件,上传后直接把图片绑定到用户ID上,不依赖session。这样就算退出再登录,只要用户ID不变,图片就不会丢。改完再没出过这毛病。你要是也碰上这问题,别去折腾服务器配置,直接改代码逻辑,把附件归属从session改成持久化存储,一劳永逸。session_destroy(),而不是session_unset()加session_regenerate_id()这种温和方式。authcode,上传时生成的随机码存在session里,用于校验附件归属。你退出,authcode没了,数据库里那条记录虽然还在,但它的authcode跟你新session里的对不上,系统就认为这是个无效附件,前台调用时直接过滤掉了。index.php?m=admin&c=index&a=public_logout&safe=0,加了个safe参数绕过了那个清session的钩子。
-
上一篇
-
下一篇
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-