CentOS7升级AlmaLinux8后session_start()生成两个sess文件问题
从CentOS7升级到AlmaLinux8运行PHP8代码时,调用session_start()会生成两个sess_xxxxxxxx格式的会话文件,但CentOS7环境下仅生成一个。更奇怪的是,测试脚本执行时只显示一个会话文件,但后台用ls命令查看能看到第二个(看起来是脚本执行后后续生成的)。
测试脚本
<?php echo "<LI><b>session-start</b><PRE>BEFORE: " . print_r(glob(ini_get('session.save_path') . "/*"), true) . "</PRE>"; session_start(); echo "<LI><b>session-started</b>=<PRE>AFTER: " . print_r(glob(ini_get('session.save_path') . "/*"), true) . "</PRE>";
脚本输出
session-start BEFORE: Array ( ) session-started= AFTER: Array ( [0] => /var/www/vhosts/xxxxxxx/private/php_sess/sess_2qbs9shppmphjf7igarhmj0k42 ) 2qbs9shppmphjf7igarhmj0k42
后台ls命令结果
[18:19:28 php_sess] $ pwd /var/www/vhosts/xxxxxxx/private/php_sess [18:19:30 php_sess] $ ls sess_2qbs9shppmphjf7igarhmj0k42 sess_eup7lqe2f7otoavfj75v5u7693
原因分析
PHP版本会话机制差异:PHP8相对于CentOS7默认的PHP版本(如PHP7.2),会话处理逻辑有调整。AlmaLinux8的PHP8环境可能触发了会话ID再生——比如开启
session.use_strict_mode后,若客户端未发送有效会话ID,PHP会强制生成新ID,过程中可能遗留旧的临时会话文件;或者某些场景下session.regenerate_id被隐式调用,导致新旧两个会话文件共存。会话文件延迟写入:PHP默认会在脚本执行完毕后才将会话数据写入磁盘,测试脚本中的
glob只能捕获session_start()执行时已存在的文件,第二个文件可能是脚本结束后的会话关闭阶段才写入的,因此ls能看到但脚本输出里没有。环境配置差异:AlmaLinux8的PHP默认配置可能开启了CentOS7中没有的安全选项,比如
session.use_strict_mode = On(PHP8默认开启),这种情况下空会话ID会触发新会话生成,若初始化阶段产生临时文件就会留下两个;另外会话锁机制、session.save_handler的实现变化也可能导致该现象。隐性请求触发:检查是否存在页面加载时的隐性请求(如
favicon.ico、页面内嵌资源请求),这类请求也会触发PHP会话初始化,生成额外的会话文件。可以查看服务器访问日志确认是否有额外请求。
解决建议
- 对比CentOS7和AlmaLinux8的
php.ini配置,重点检查session.use_strict_mode、session.regenerate_id、session.save_path等参数差异; - 开启会话日志(设置
session.log_errors = On并指定error_log路径),查看会话创建、销毁的详细过程; - 排查页面是否存在隐性请求,确认是否是额外请求导致的多会话文件。
内容的提问来源于stack exchange,提问作者abe1432181

