session_start()
时,有时会收到“会话已开始”的错误消息。为此,我放置了以下行:if(!isset($_COOKIE["PHPSESSID"]))
{
session_start();
}
,但是这次我收到了以下警告消息:变量:_SESSION
是否有更好的方法来检查会话是否已经开始?警告?
#1 楼
PHP> = 5.4.0版本,PHP 7版本的推荐方法if (session_status() == PHP_SESSION_NONE) {
session_start();
}
参考:http://www.php.net/manual/zh/function/session -status.php
对于PHP <5.4.0版本
if(session_id() == '') {
session_start();
}
评论
我认为PHP <5.4的解决方案存在问题。 session_id在会话第一次启动时被设置,但是在会话关闭时不会被删除。因此,例如,如果在代码段之前有一个像session_start(); session_write_close();之类的代码:则if条件失败但我们没有打开的会话
–NicolòMartini
2014年5月15日晚上11:26
@Nicolo Martini据我了解:以脚本顶部的session_start()开始的会话在脚本退出时关闭,或者在脚本退出之前调用session_write_closed()时关闭。即当数据被写入会话cookie且该会话被另一个也称为“ session_start”的脚本访问时,会话关闭。因此,CLOSING并不意味着该会话已被销毁。您可以通过退出当前脚本或调用session_write_close()关闭会话,也可以通过调用session_start()再次打开会话。我的理解,至少。
– Stefan
16 Dec 15 '12:00
这仍然是开始会议的好方法吗?因为在链接中没有与此答案相关的内容
–csandreas1
18年6月1日在11:22
@ csandreas1,您将从链接中看到session_status的描述及其预期的返回值。您的问题的答案是肯定的!
–lovelyramos
18/12/5在17:31
在某些情况下,我会失败-成功使用了if(!isset($ _ SESSION))
–斯科特
5月29日15:07
#2 楼
对于PHP 5.4.0之前的PHP版本:if(session_id() == '') {
// session isn't started
}
尽管恕我直言,如果您不知道是否需要重构会话管理代码,则应该考虑一下。没有开始会议...
那是我的主观看法,在某些情况下(以下示例中的示例已描述),可能无法知道会议开始。
评论
不知道会话是否开始并不一定很坏。如果您正在延迟加载(仅在第一次需要时才开始会话),那么答案中的测试将是完美的。
– drewm
2011年6月6日9:53
同样在某些环境中,apache设置了会话自动启动
– LeonardChallis
2012年9月14日18:32
一个测试session_id()是否在包含文件中返回空字符串的示例:
–tgoneil
2012年10月5日在8:05
关于重构会话管理的评论(如果您不知道它是否变脏了)不是很重要。例如,如果将高级功能编码为WordPress主题,您将永远不知道插件是否已经开始使用会话而不进行检查。编码世界并不总是那么黑:P
–Jimbo Jonny
2012年11月27日17:23
嗯,确实不错。我确实承认我的评论非常主观-我将修改答案以反映这一点。
– Alex
13年8月8日在12:58
#3 楼
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_status,在不可用时使用较旧的方法,似乎在这里是完美的BTW,提示提示:)
–Jimbo Jonny
2012年11月27日17:30
感谢您的更新本杰明。很高兴知道从PHP 5.4开始可以使用一种新方法。
–登录
2012年11月28日,0:19
这是一种更好的检查方法,您并不总是知道是否启动了会话,尤其是当用户在浏览网站的过程中清除cookie时……我总是为2岁的孩子编写代码,永远不知道用户会做什么;-)至于我自己,我有一个小的Config.php文件,该文件在我所有的脚本上都被调用以设置变量和其他信息,因此只要在该文件中添加该文件,始终可以确保会话启动这是必需的
–安迪·布拉汉姆(Andy Braham)
2013年6月11日18:03
#4 楼
您可以做到这一点,而且非常容易。评论
@zloctb:我想不出要使用$ _SESSION = array();的任何情况,所以这个答案似乎还可以。
–halfer
13-10-19在7:57
@halfer请参阅Ryan的答案。如果已经调用session_destroy(),则仍可以设置$ _SESSION。另外,在单元测试中,您可以直接设置$ _SESSION。但是我对此表示赞同,因为在大多数实际情况下,这个答案应该足够好(直到再也没有看到PHP 5.3了……)
–达伦·库克(Darren Cook)
2014年3月2日在7:43
#5 楼
if (version_compare(phpversion(), '5.4.0', '<')) {
if(session_id() == '') {
session_start();
}
}
else
{
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
}
#6 楼
在PHP 5.4之前,除了设置全局标志之外,没有其他可靠的方法。考虑: >
var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.
因此,在PHP 5.4之前,您应该设置全局布尔值。
#7 楼
对于所有php版本if ((function_exists('session_status')
&& session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
session_start();
}
评论
同样,如果((defined('PHP_SESSION_ACTIVE')&& session_status()!== PHP_SESSION_ACTIVE)||!session_id()),
– Anthony Hatzopoulos
2014-11-26 3:37
#8 楼
检查以下内容:<?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
#9 楼
使用session_id(),如果未设置,则返回空字符串。比检查$_COOKIE
更可靠。if (strlen(session_id()) < 1) {
session_start();
}
#10 楼
if (session_id() === "") { session_start(); }
希望对您有所帮助!
#11 楼
这应该适用于所有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();
}
}
}
#12 楼
您唯一需要做的是:<?php
if(!isset($_SESSION))
{
session_start();
}
?>
评论
这是我多年来使用的那个。有人建议不要使用这个吗?当然,最好检查一下是否有时会启动会话-在某些环境中,apache设置了会话自动启动,延迟加载(仅在首次需要时才启动会话),或者只是有时需要进行快速黑客攻击
– K. Kilian Lindberg
2014年4月1日在9:49
上面是同样的回应(@miyuru)
–user1817927
16年4月15日在16:55
#13 楼
不确定这种解决方案的效率,但这来自正在运行的项目。如果您需要定义默认语言,也可以使用此方法
#14 楼
在函数调用之前插入@
可以抑制函数调用期间可能报告的任何错误。 br /> 在已经向浏览器中打印了某些内容后使用
@
会导致错误,因此PHP将显示类似“无法发送标头:从第12行开始”的信息,在这种情况下session_start
仍然会失败,但错误消息不会显示在屏幕上。在包含文件或重定向到新页面之前,请使用
session_start()
函数,否则会出现错误。 此代码可用于所有情况:
<?php
if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
session_start();
}
?>
#15 楼
在PHP 5.3上,这对我有用:if(!strlen(session_id())){
session_name('someSpecialName');
session_start();
}
那么您就有了。如果您不将not at if语句放在开头,那么会话将以任何方式开始,我不这样做。
#16 楼
响应基于@Meliza Ramos响应(请参阅第一个响应)和http://php.net/manual/zh/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();
}
}
#17 楼
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文件,您可以通过选择盘子并删除/添加或更改订单。
我正在使用的服务器没有实际版本,所以我使其变得更加灵活。这取决于作者希望使用并尝试一下。
#18 楼
该代码段对您有用吗?if (!count($_SESSION)>0) {
session_start();
}
#19 楼
您应该重新组织代码,以使每个页面执行一次调用session_start()
。评论
在某些情况下,可能不希望每个页面执行一次准确地调用它。
–提莫·霍维宁(Timo Huovinen)
2012年4月28日13:37
如果要终止会话以重新创建会话,请确保,但这是一种特殊情况。通常,应用程序应具有从头开始运行一次的代码,即session_start()所在的位置。
– SamT
2012年4月29日在22:51
例如,一个应用程序将会话存储在一个文件上,并且需要加载2个并发的慢速数据请求,这些请求都不需要会话,但是一个会阻塞另一个请求,因为session_start会锁定会话文件。
–提莫·霍维宁(Timo Huovinen)
2012年4月30日在10:44
究竟。 @YuriKolovsky是正确的。亚历克斯的问题是相关的,因为这些情况有可能发生,而且并不少见。
– Paulo Coghi
2012年5月24日上午11:56
-1,大多数网站都是由CMS驱动的,并且通常由不同的各方编写诸如主题和插件之类的东西,却不知道彼此的代码是否已经开始会话。这仅是代码组织问题的暗示是错误的。
–Jimbo Jonny
2012年11月27日17:27
#20 楼
session_start();
if(!empty($_SESSION['user']))
{
//code;
}
else
{
header("location:index.php");
}
#21 楼
PHP_VERSION_ID自PHP 5.2.7起可用,因此请先进行检查,必要时进行创建。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();
}
}
#22 楼
根据我的实践,在访问$_SESSION[]
之前,您需要每次都调用session_start
来使用脚本。请参见下面的手册链接。http://php.net/manual/zh-CN/function.session-start.php
对我来说,至少
session_start
令人困惑一个名字。 session_load
可以更清晰。#23 楼
我最终仔细检查了状态。 php 5.4+if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};
#24 楼
您可以使用以下解决方案来检查PHP会话是否已经启动:if(session_id()== '')
{
echo"Session isn't Start";
}
else
{
echo"Session Started";
}
评论
有效答案更为详细。
–ClémentPrévost
'18 Sep 9'在16:31
#25 楼
这就是我用来确定会话是否已开始的内容。通过使用empty和isset,如下所示:if (empty($_SESSION) && !isset($_SESSION)) {
session_start();
}
#26 楼
将session_start();
替换为:if (!isset($a)) {
a = False;
if ($a == TRUE) {
session_start();
$a = TRUE;
}
}
评论
它包含代码错误,并且仅当多次包含同一个文件时才起作用,但如果在闭包内则不起作用。
– BananaAcid
17/09/14在20:39
评论
如何检查是否已输入session_start的可能重复项?另请参阅Stackoverflow的以下答案:stackoverflow.com/questions/1545357/…