You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原因分析

  1. PHP版本会话机制差异:PHP8相对于CentOS7默认的PHP版本(如PHP7.2),会话处理逻辑有调整。AlmaLinux8的PHP8环境可能触发了会话ID再生——比如开启session.use_strict_mode后,若客户端未发送有效会话ID,PHP会强制生成新ID,过程中可能遗留旧的临时会话文件;或者某些场景下session.regenerate_id被隐式调用,导致新旧两个会话文件共存。

  2. 会话文件延迟写入:PHP默认会在脚本执行完毕后才将会话数据写入磁盘,测试脚本中的glob只能捕获session_start()执行时已存在的文件,第二个文件可能是脚本结束后的会话关闭阶段才写入的,因此ls能看到但脚本输出里没有。

  3. 环境配置差异:AlmaLinux8的PHP默认配置可能开启了CentOS7中没有的安全选项,比如session.use_strict_mode = On(PHP8默认开启),这种情况下空会话ID会触发新会话生成,若初始化阶段产生临时文件就会留下两个;另外会话锁机制、session.save_handler的实现变化也可能导致该现象。

  4. 隐性请求触发:检查是否存在页面加载时的隐性请求(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:18:10