我有一个PHP文件,有时从一个已经开始会话的页面调用,有时从一个没有会话启动的页面调用。因此,当我在这个脚本上有session_start()时,我有时会得到“会话已经开始”的错误消息。为此,我写了以下几行:
if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
但这次我收到了警告信息:
注意:未定义变量:_SESSION
是否有更好的方法来检查会话是否已经开始?
如果我使用@session_start,它会使事情正常工作,只是关闭警告?
PHP 5.4引入了session_status(),它比依赖session_id()更可靠。
考虑下面的代码片段:
session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false
因此,要检查会话是否已启动,PHP 5.4中推荐的方法是:
session_status() == PHP_SESSION_ACTIVE
在函数调用之前@会抑制函数调用过程中可能报告的任何错误。
在session_start之前添加@告诉PHP避免打印错误消息。
例如:
在你已经打印了一些东西到浏览器之后使用session_start()会导致一个错误,所以PHP会显示类似“头不能被发送:started at (line 12)”这样的东西,@session_start()在这种情况下仍然会失败,但错误消息不会打印在屏幕上。
在包含文件或重定向到新页面之前,请使用exit()函数,否则将报错。
此代码可以在所有情况下使用:
<?php
if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
session_start();
}
?>