检查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(); ?> 

来源http://php.net

使用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; } }