PHP 8 升级后出现 session 序列化处理器 Warning,通常是因为 php.ini 中 session.serialize_handler 配置不一致或旧版本会话数据格式不兼容。最推荐的处理方向是统一处理器配置为 php_serialize 并清理旧的 session 文件,风险边界在于清理 session 会导致所有用户强制重新登录。
先说结论:升级后必须确保所有节点 session.serialize_handler 配置一致,且旧 session 数据无法跨版本通用,需清理重置。
- 先确认:检查 php.ini 中 session.serialize_handler 值是否为 php_serialize
- 先处理:删除服务器 session.save_path 目录下的所有旧 session 文件
- 再验证:重启 PHP 服务后查看错误日志是否还有 Warning
命令速用版
直接修改配置文件并清理缓存,适用于单台服务器或可维护窗口期。
vim /etc/php/8.0/fpm/php.ini
查找 session.serialize_handler,确保值为:
session.serialize_handler = php_serialize
清理旧 session 文件(路径以 php.ini 中 session.save_path 为准):
rm -rf /var/lib/php/sessions/*
重启服务:
systemctl restart php8.0-fpm
为什么会这样
PHP 8 对内部序列化处理逻辑进行了更严格校验,旧版本生成的 session 数据可能包含 PHP 8 不再接受的格式。
不同 PHP 版本间的 session 序列化格式不完全兼容,尤其是使用了 igbinary 等扩展时,扩展未重新编译会导致处理器失效。此外,php 和 php_serialize 两种处理器生成的数据格式不同,混用会导致 decode 失败。
分步处理
按顺序执行以下操作,确保配置生效且无残留。
步骤 1:检查当前配置
创建 phpinfo.php 文件,访问后搜索 session.serialize_handler,确认当前值。如果显示为 php,建议改为 php_serialize。
步骤 2:统一扩展版本
如果使用了 igbinary 等自定义处理器,必须确保扩展是针对 PHP 8 编译的最新版本。使用 pecl upgrade igbinary 重新安装。
步骤 3:清理旧数据
找到 session.save_path 指向的目录,备份后清空该目录。不清理旧数据会导致旧格式 session 读取时报 Warning。
步骤 4:重启服务
修改配置后必须重启 PHP-FPM 或 Apache 服务,否则配置不生效。
怎么验证是否生效
查看 PHP 错误日志,确认不再出现 session 相关的 Warning。
登录网站功能,确认能正常写入和读取 session,且无报错。再次访问 phpinfo 页面,确认配置值已更新。
常见坑
负载均衡环境下,如果多台服务器 session.serialize_handler 配置不一致,会导致用户请求漂移后登录失效。
使用了 Redis 存储 session 时,同样需要清理 Redis 中的旧 key,否则序列化格式错误依然存在。
常见问题
必须清理旧 session 文件吗?
是的,PHP 大版本升级后旧格式数据可能无法反序列化,不清理会持续报错。
php_serialize 和 php 处理器有什么区别?
php_serialize 使用标准的 serialize 函数,兼容性更好,php 是旧版格式,建议统一用 php_serialize。
升级后用户需要重新登录吗?
需要,清理 session 文件会销毁所有当前会话,用户必须重新认证。
参考来源
- PHP Manual, Session Configuration, https://www.php.net/manual/en/session.configuration.php#ini.session.serialize-handler
- PHP Manual, PHP 8.0 Incompatible Changes, https://www.php.net/manual/en/migration80.incompatible.php