rku*_*lla 54

从PHP 4.3.3开始,在会话已经启动时调用session_start()将导致E_NOTICE警告.对session_start()的第二次调用将被忽略.您可以检查会话是否已首先启动,或者不是:

if (session_id() == "")
  session_start();
Run Code Online (Sandbox Code Playgroud)


Cha*_*rch 27

来自文档:

从PHP 4.3.3开始,在先前启动会话之后调用session_start()将导致级别E_NOTICE的错误.此外,第二个会话开始将被忽略.

所以不,它不会"造成伤害",但它会引发错误.它正在发生的事实可能表明你做错了什么,可能需要重新思考你的代码是如何布局的.


San*_*ser 14

调用session_start(); 会损害您的应用程序的性能.

以下代码将触发E_NOTICE,但不会损害那么多性能

<?php
session_start();
session_start();
?>
Run Code Online (Sandbox Code Playgroud)

但是调用以下内容会损害性能!但它仍然有用.如果你有一个运行3分钟的脚本,并使用XHR(js)调用.在这种情况下,使用session_write_close很有用.否则对服务器的请求将被阻止,直到会话被释放.您可能希望在脚本开头和脚本结束时使用会话.

<?php
session_start();
session_write_close();
session_start();
?>
Run Code Online (Sandbox Code Playgroud)

但是,当你调用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);
}
?>
Run Code Online (Sandbox Code Playgroud)


vic*_*vic 5

阅读 session_start 的文档,我只能看到:

从 PHP 4.3.3 开始,session_start()在会话之前启动之后调用将导致 level 错误E_NOTICE。此外,第二个会话开始将被简单地忽略。

所以,你会得到一个E_NOTICE并被忽略。