检查PHP会话是否已经启动
我有一个PHP文件,有时从已启动会话的页面调用,有时从没有启动会话的页面调用。 因此,当我在此脚本上使用session_start()
,有时会收到“会话已启动”的错误消息。 为此,我把这些线:
if(!isset($_COOKIE["PHPSESSID"])) { session_start(); }
但是这次我收到了这个警告信息:
注意:未定义variables:_SESSION
有没有更好的方法来检查会话是否已经开始?
如果我使用@session_start
它会使事情正常工作,只是闭嘴警告?
对于PHP> = 5.4.0版本的推荐方式
if (session_status() == PHP_SESSION_NONE) { session_start(); }
资料来源: http : //www.php.net/manual/en/function.session-status.php
对于PHP版本<5.4.0
if(session_id() == '') { session_start(); }
对于PHP 5.4.0以前版本的PHP:
if(session_id() == '') { // session isn't started }
虽然,恕我直言,你真的应该考虑重构你的会议pipe理代码,如果你不知道会议是否开始…
也就是说,我的观点是主观的,有些情况下(在下面的评论中描述了这样的例子),在那里可能无法知道会议是否开始。
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
你可以做到这一点,这很容易。
if (!isset($_SESSION)) session_start();
希望它有助于:)
if (version_compare(phpversion(), '5.4.0', '<')) { if(session_id() == '') { session_start(); } } else { if (session_status() == PHP_SESSION_NONE) { session_start(); } }
在PHP 5.4之前,除了设置一个全局标志外,没有其他可靠的方法可以知道。
考虑:
var_dump($_SESSION); // null session_start(); var_dump($_SESSION); // array session_destroy(); var_dump($_SESSION); // array, but session isn't active.
要么:
session_id(); // returns empty string session_start(); session_id(); // returns session hash session_destroy(); session_id(); // returns empty string, ok, but then session_id('foo'); // tell php the session id to use session_id(); // returns 'foo', but no session is active.
所以,在PHP 5.4之前,你应该设置一个全局布尔值。
对于所有的PHP版本
if ((function_exists('session_status') && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) { 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; } // Example if ( is_session_started() === FALSE ) session_start(); ?>
使用session_id() ,如果没有设置,它将返回一个空string。 这比检查$_COOKIE
更可靠。
if (strlen(session_id()) < 1) { session_start(); }
if (session_id() === "") { session_start(); }
希望它有帮助!
这应该适用于所有PHP版本。 它决定了PHP版本,然后检查会话是否基于PHP版本启动。 那么如果会话没有启动,就启动它。
function start_session() { if(version_compare(phpversion(), "5.4.0") != -1){ if (session_status() == PHP_SESSION_NONE) { session_start(); } } else { if(session_id() == '') { session_start(); } } }
你唯一需要做的是:
<?php if(!isset($_SESSION)) { session_start(); } ?>
您应该重新组织代码,以便每个页面执行一次就调用session_start()
。
不确定这样的解决scheme的效率,但这是来自工作项目如果您需要定义默认语言,也可以使用
/** * Start session * Fall back to ukrainian language */ function valid_session() { if(session_id()=='') { session_start(); $_SESSION['lang']='uk'; $_SESSION['lang_id']=3; } return true; }
基于@Meliza Ramos Response(见第一个响应)和http://php.net/manual/en/function.phpversion.php的响应,;
行动:
- 定义PHP_VERSION_ID如果不存在
- 定义函数来检查基于PHP_VERSION_ID的版本
- 定义函数openSession()安全
只使用openSession()
// PHP_VERSION_ID is available as of PHP 5.2.7, if our // version is lower than that, then emulate it if (!defined('PHP_VERSION_ID')) { $version = explode('.', PHP_VERSION); define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); // PHP_VERSION_ID is defined as a number, where the higher the number // is, the newer a PHP version is used. It's defined as used in the above // expression: // // $version_id = $major_version * 10000 + $minor_version * 100 + $release_version; // // Now with PHP_VERSION_ID we can check for features this PHP version // may have, this doesn't require to use version_compare() everytime // you check if the current PHP version may not support a feature. // // For example, we may here define the PHP_VERSION_* constants thats // not available in versions prior to 5.2.7 if (PHP_VERSION_ID < 50207) { define('PHP_MAJOR_VERSION', $version[0]); define('PHP_MINOR_VERSION', $version[1]); define('PHP_RELEASE_VERSION', $version[2]); // and so on, ... } } function phpVersionAtLeast($strVersion = '0.0.0') { $version = explode('.', $strVersion); $questionVer = $version[0] * 10000 + $version[1] * 100 + $version[2]; if(PHP_VERSION_ID >= $questionVer) return true; else return false; } function openSession() { if(phpVersionAtLeast('5.4.0')) { if(session_status()==PHP_SESSION_NONE) session_start(); } else // under 5.4.0 { if(session_id() == '') session_start(); } }
if (version_compare(PHP_VERSION, "5.4.0") >= 0) { $sess = session_status(); if ($sess == PHP_SESSION_NONE) { session_start(); } } else { if (!$_SESSION) { session_start(); } }
事实上,现在解决这个问题现在已经太迟了。 这是我的其中一个项目的.inc文件,您可以通过select菜单并删除/添加或更改订单来为餐厅configuration菜单。 我工作的服务器没有实际的版本,所以我使它更加灵活。 这是由作者希望使用和尝试。
这段代码是否适合你?
if (!count($_SESSION)>0) { session_start(); }
在PHP 5.3上,这对我有用:
if(!strlen(session_id())){ session_name('someSpecialName'); session_start(); }
那么你有。 如果你不把不说话开始会话将开始任何方式,我不是为什么。
session_start(); if(!empty($_SESSION['user'])) { //code; } else { header("location:index.php"); }
PHP_VERSION_ID从PHP 5.2.7起可用,所以首先检查一下,如果需要的话,创build它。 session_status
自PHP 5.4起可用,所以我们也要检查这个:
if (!defined('PHP_VERSION_ID')) { $version = explode('.', PHP_VERSION); define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); }else{ $version = PHP_VERSION_ID; } if($version < 50400){ if(session_id() == '') { session_start(); } }else{ if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } }
我用来确定会话是否已经开始使用空和isset如下:
if (empty($_SESSION) && !isset($_SESSION)) { session_start(); }
replacesession_start();
有:
if (!isset($a)) { a = False; if ($a == TRUE) { session_start(); $a = TRUE; } }