在构建页面请求时(在php中)多次运行session_start()有什么害处吗?

时间:2010-04-05 18:46:42

标签: php session

据推测,有一些微小的性能损失,但除此之外?

8 个答案:

答案 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(); }`