Session 是否已启用?看 session_status() 返回值直接调用 session_status() 是最可靠的方式,它不依赖是否已启动 Session,也不触发自动开启。返回值为整数:PHP_SESSION_DISABLED(扩展未加载)、PHP_SESSION_NONE(已加载但未启动)、PHP_SESSION_ACTIVE(已启动且可用)。

Session 是否已启用?看 session_status() 返回值
直接调用 session_status() 是最可靠的方式,它不依赖是否已启动 Session,也不触发自动开启。返回值为整数:PHP_SESSION_DISABLED(扩展未加载)、PHP_SESSION_NONE(已加载但未启动)、PHP_SESSION_ACTIVE(已启动且可用)。探针里别用 session_id() 或 isset($_SESSION) 判断是否启用——它们在未启动时会静默启动 Session,干扰检测结果。
为什么 session_start() 失败?优先检查配置项
常见失败不是代码问题,而是 PHP 配置限制。探针中应读取并展示以下 ini 值:
-
session.save_handler:非files时(如redis、memcached),需确认对应扩展已加载且服务可达 -
session.save_path:若为文件存储,路径必须存在、可写,且磁盘未满;Windows 下注意反斜杠转义问题 -
session.cookie_httponly和session.cookie_secure:不影响启动,但关系到 Cookie 是否被 JS 读取或仅 HTTPS 传输,探针可标出但不报错 -
session.use_cookies设为0时,session_start()仍可成功,但不会发 Cookie——这点常被忽略
探针里模拟真实访问场景:手动控制 Session 生命周期
避免在探针脚本开头就无条件调用 session_start()。正确做法是分步检测:
if (session_status() === PHP_SESSION_NONE) {
// 尝试启动,捕获警告
$old = error_reporting(0);
$result = @session_start();
error_reporting($old);
if ($result === false) {
echo 'Session 启动失败,请检查 session.save_path 权限或 save_handler 配置';
}
}
这样既不污染后续逻辑,又能暴露真实错误。注意:PHP 8.0+ 中,session_start() 默认抛出异常而非警告,需用 try/catch 捕获 RuntimeException。
立即学习“PHP免费学习笔记(深入)”;
$_SESSION 写入后不持久?查 session_write_close() 调用时机
探针中常有“写入测试键 → 重载页面验证”流程,但若脚本末尾没显式调用 session_write_close(),而页面又启用了输出缓冲(ob_start)或 gzip 压缩,Session 数据可能延迟写入甚至丢失。尤其在 CLI 模式下运行探针时,session_write_close() 是必须的。
另一个易漏点:某些 SAPI(如 FastCGI)在脚本结束时未必及时刷写 Session,建议在探针写入测试数据后立即调用 session_write_close(),再做读取验证。











