可能取决于PHP设置,但如果返回值不是上述值,则使用以下方法
_DISABLED = 0
_NONE = 1
_ACTIVE = 2
(PHP 5 >= 5.4.0, PHP 7, PHP 8)
session_status — 返回当前会话状态
此函数没有参数。
PHP_SESSION_DISABLED
如果会话已禁用。
PHP_SESSION_NONE
如果会话已启用,但不存在任何会话。
PHP_SESSION_ACTIVE
如果会话已启用,且存在一个会话。
可能取决于PHP设置,但如果返回值不是上述值,则使用以下方法
_DISABLED = 0
_NONE = 1
_ACTIVE = 2
始终使用session_status() 检查会话是否已启动并处于活动状态。
if(session_status() !== PHP_SESSION_ACTIVE) session_start();
或者
if(session_status() === PHP_SESSION_NONE) session_start();
不要使用
if(!isset($_SESSION)) session_start();
或者
if(session_id() === "") session_start();
调用session_write_close() 后,它们将无法正常工作。
这两个函数都将继续报告会话存在。
这是正确的,您可以从$_SESSION读取,但如果您想写入,
则需要再次调用session_start()。
作为简写,您可以使用
@session_start()
在开头使用@可以抑制
PHP提示“会话已启动 - 忽略session_start()”
如session_start() 手册中所述,第二次调用不会造成任何损害,
它将被简单地忽略。但是,如果您不想收到提示,则需要使用@。
用于检查会话状态的通用函数。
<?php
/**
* @return bool
*/
function is_session_started()
{
if ( php_sapi_name() !== 'cli' ) {
if ( version_compare(phpversion(), '5.4.0', '>=') ) {
return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
} else {
return session_id() === '' ? FALSE : TRUE;
}
}
return FALSE;
}
// 示例
if ( is_session_started() === FALSE ) session_start();
?>
注意session_status() 仅适用于基于文件的会话。
基于数据库的会话状态需要根据表结构创建自定义函数。
应谨慎对待ive_insomnia at live dot com的建议。
首先,虽然他使用session_status的用例有效,但避免警告更简单的方法是
<?php
if (!isset($_SESSION)) { session_start(); }
?>
session_status的示例使用专门为此目的创建的常量的原始值(在本例中为2),以避免使用魔术数字。
更好的代码应该是
<?php
if (session_status() !== PHP_SESSION_ACTIVE) {session_start();}
?>
也可以使用
<?
if (session_id() === "") { session_start(); }
?>
此函数的使用更多地在于状态管理:例如,当会话完全禁用时,更改脚本的行为。
这就是session_status() 的工作方式
<?php
function session_status(){
if(!extension_loaded('session')){
return 0;
}elseif(!file_exists(session_save_path().'/sess_'.session_id()){
return 1;
}else{
return 2;
}
}
?>
另一个确定会话是否已启动的函数
function is_session_started () {
return function_exists ( 'session_status' ) ? ( PHP_SESSION_ACTIVE == session_status () ) : ( ! empty ( session_id () ) );
}