仅当会话不存在时才加载 session_start()?

2022-08-31 00:05:46

是否有简短的代码技巧来检查会话是否已启动,如果没有,则加载一个会话?目前,我收到错误“会话已启动...”如果我放入会话启动而不考虑检查。


答案 1

isset通常是检查当前是否定义了预定义变量的正确方法:

如果您使用的是 5.4 之前的 php 版本

您通常可以逃脱并且只是执行下面的代码,但是请注意,如果由于某种原因禁用了会话,则仍会调用session_start(),这最终可能导致错误和不必要的调试,因为不允许创建$_SESSION数组。

if(!isset($_SESSION)){session_start();}

如果要考虑检查会话是否由于某种原因而被禁用,则可以抑制错误消息,设置测试会话变量,然后验证是否已设置。如果不是,则可以在已禁用会话的反应中编写代码。您需要在脚本开始时或附近执行所有这些操作。因此,作为一个例子(根据错误处理设置,工作方式不同):

if(!isset($_SESSION)){session_start();}
$_SESSION['valid'] = 'valid';
if($_SESSION['valid'] != 'valid')
{
   //handle disabled sessions
}

但是,如果您使用的是 php 版本 5.4 或更高版本

您可以使用session_status()函数,这是一个更好的选择,因为它可以解释被禁用的会话并检查会话是否已存在。

if (session_status() === PHP_SESSION_NONE){session_start();}

请注意,PHP_SESSION_NONE是 PHP 设置的常量,因此不需要用引号括起来。它的计算结果为整数 1,但由于它是一个专门设置为消除对幻数需求的常量,因此最好针对常量进行测试。


答案 2

许多人只是用来抑制会话已启动的警告。替代方案通常是:@session_start()

if (session_status() === PHP_SESSION_NONE) session_start();

推荐