据推测,有一些微小的性能损失,但除此之外?
答案 0 :(得分:51)
从PHP 4.3.3开始,在会话已经启动时调用session_start()将导致E_NOTICE警告。对session_start()的第二次调用将被忽略。您可以通过以下方式检查会话是否已首先启动:
if (session_id() == "")
session_start();
答案 1 :(得分:24)
来自the docs:
从PHP 4.3.3开始,在先前启动会话之后调用session_start()将导致级别E_NOTICE的错误。此外,第二个会话开始将被忽略。
所以不,它不会“造成伤害”,但它会引发错误。它正在发生的事实可能表明你做错了什么,可能需要重新思考你的代码是如何布局的。
答案 2 :(得分:14)
调用session_start();可能会损害您的应用程序的性能。
以下代码将触发E_NOTICE,但不会损害那么多性能
<?php
session_start();
session_start();
?>
但是调用以下内容会损害性能! 但它仍然有用。如果你有一个运行3分钟的脚本,并使用XHR(js)调用。 在这种情况下,使用session_write_close很有用。否则对服务器的请求将被阻止,直到会话被释放。您可能希望在脚本开头和脚本结束时使用会话。
<?php
session_start();
session_write_close();
session_start();
?>
但是,当你调用session_start()时;所有信息都被反序列化,当你调用session_write_closed()时,它被序列化了。 所以如果你有很多数据,它可能会非常慢!
以下测试显示它有多大影响。
1.0130980014801 sesion_start +以空会话结束
1.0028710365295没有会话的正常循环
12.808688879013会话中有很多数据,包含start + close
1.0081849098206再次正常循环(无用有点)
<?php
//start and clear first session
session_start();
session_destroy();
session_write_close();
//test one
if(true) {
//test loop one
$start = microtime(true);
for($i = 0; $i < 1000; $i++) {
session_start();
usleep(100);
session_write_close();
}
$end = microtime(true);
echo($end - $start);
//test loop 2
echo('<br />');
$start = microtime(true);
for($i = 0; $i < 1000; $i++) {
usleep(100);
}
$end = microtime(true);
echo($end - $start);
}
//fill the array with information so serialization is needed
session_start();
$_SESSION['test'] = array();
for($i = 0; $i < 10000; $i++) {
$_SESSION['test'][$i] = chr($i);
}
session_write_close();
echo('<br />');
//test two
if(true) {
//test loop one
$start = microtime(true);
for($i = 0; $i < 1000; $i++) {
session_start();
usleep(100);
session_write_close();
}
$end = microtime(true);
echo($end - $start);
//test loop 2
echo('<br />');
$start = microtime(true);
for($i = 0; $i < 1000; $i++) {
usleep(100);
}
$end = microtime(true);
echo($end - $start);
}
?>
答案 3 :(得分:4)
阅读session_start的文档,我只能看到:
从PHP 4.3.3开始,在会话之前启动后调用
session_start()
将导致级别E_NOTICE
的错误。此外,第二个会话开始将被忽略。
因此,您将获得E_NOTICE
并被忽略。
答案 4 :(得分:3)
如果它产生错误,则开发人员不打算发生该特定操作的可能性很小。所以,是的,尽管你在W3Schools展示了什么,但从技术上来说这是一个“糟糕”的事情。
所以,不是安全地玩并尝试在每个页面上设置会话,为什么不首先在你前进之前检查会话是否存在?
if ( !isset($_SESSION) ) session_start();
就个人而言,我首先要检查会话的cookie是否存在。
答案 5 :(得分:2)
我通常将会话启动语句放在我需要的包含文件中。但我不认为多次通话应该存在问题。
答案 6 :(得分:1)
如果会话已经打开,那么它将返回错误通知,并且将忽略新会话。所以没有伤害,但你会有一个麻烦的错误。
但是......如果您发现需要这样做,那么可能是您的代码组织不好的症状。看看如何避免重复冗余任务(例如开始会话)可能对您有利。
答案 7 :(得分:-1)
`总是使用它来包含php中的页眉和页脚文件。你在两个页面上开始会话,但你使用它然后session_start()
if(!isset($ _ SESSION)){session_start(); }`