rku*_*lla 54
从PHP 4.3.3开始,在会话已经启动时调用session_start()将导致E_NOTICE警告.对session_start()的第二次调用将被忽略.您可以检查会话是否已首先启动,或者不是:
if (session_id() == "")
session_start();
Run Code Online (Sandbox Code Playgroud)
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)
阅读 session_start 的文档,我只能看到:
从 PHP 4.3.3 开始,
session_start()在会话之前启动之后调用将导致 level 错误E_NOTICE。此外,第二个会话开始将被简单地忽略。
所以,你会得到一个E_NOTICE并被忽略。