已经启动的PHP会话
在我的PHP代码中,如果一个会话已经开始了,我试着开始一个新的会话,我得到以下的通知:
注意:会话已经开始 – 忽略session_start()
我怎样才能避免这一点?
尝试
<?php if(!isset($_SESSION)) { session_start(); } ?>
如果你想要一个新的,那么在启动之前先做session_destroy()
。 要在启动之前检查它的设置,请调用session_status()
:
$status = session_status(); if($status == PHP_SESSION_NONE){ //There is no active session session_start(); }else if($status == PHP_SESSION_DISABLED){ //Sessions are not available }else if($status == PHP_SESSION_ACTIVE){ //Destroy current and start new one session_destroy(); session_start(); }
我会避免检查全局的$_SESSION
而不是调用session_status()
方法,因为PHP明确地实现了这个function:
通过新函数session_status公开会话状态这是为(PHP> = 5.4.0)
只有当你想破坏以前的会话:
<?php if(!isset($_SESSION)) { session_start(); } else { session_destroy(); session_start(); } ?>
或者你可以使用
unset($_SESSION['variable_session _data'])
销毁一个特定的会话variables。
是的,您可以通过检查isset($_SESSION)
来检测会话是否已经在运行。 然而,最好的答案是不要多次调用session_start()
。
应该在脚本中尽早调用,可能甚至是第一行,然后再不要再调用。
如果你在你的代码中有多个地方,那么你就是要求得到这样的错误。 把它剪下来,所以只能在一个地方,只能调用一次。
你必须已经调用会话开始也许被通过包含再次调用?
if( ! $_SESSION) { session_start(); }
尝试这个
if(!isset($_SESSION)){ session_start(); }
我build议你使用ob_start(); 在开始任何sesson可变之前,这应该命令您的浏览器缓冲区。
编辑:$ _SESSION后添加了一个额外的)
以上都不适合,不要在所有依赖于$ Sessionvariables的php文件中调用session_start(),否则不会包含它们。 通知是如此烦人,并迅速填写Error_log。 我能find的唯一解决scheme是这样的…
error_reporting(E_ALL ^ E_NOTICE); session_start();
一个不好的解决方法,但它的工作。
我试图修复$ _SESSION的阻止行为时遇到此问题。
http://konrness.com/php5/how-to-prevent-blocking-php-requests/
会话文件保持locking状态,直到脚本完成或会话手动closures。
所以,默认情况下,页面应该以只读模式打开一个会话。 但一旦以只读方式打开,必须以写入模式closures并重新打开。
const SESSION_DEFAULT_COOKIE_LIFETIME = 86400; /** * Open _SESSION read-only */ function OpenSessionReadOnly() { session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME, 'read_and_close' => true, // READ ACCESS FAST ]); // $_SESSION is now defined. Call WriteSessionValues() to write out values } /** * _SESSION is read-only by default. Call this function to save a new value * call this function like `WriteSessionValues(["username"=>$login_user]);` * to set $_SESSION["username"] * * @param array $values_assoc_array */ function WriteSessionValues($values_assoc_array) { // this is required to close the read-only session and // not get a warning on the next line. session_abort(); // now open the session with write access session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME ]); foreach ($values_assoc_array as $key => $value) { $_SESSION[ $key ] = $value; } session_write_close(); // Write session data and end session OpenSessionReadOnly(); // now reopen the session in read-only mode. } OpenSessionReadOnly(); // start the session for this page
那么当你去写一些价值:
WriteSessionValues(["username"=>$login_user]);
这会更有效率:
@session_start();
避免屏幕上的error handling程序
最好,
<?php if ( session_id() != "" ) { session_start(); }
基本上,在创build另一个会话之前,您需要检查会话是否已经启动; …更多的阅读 。
另一方面,您select在使用session_destroy()
创build另一个会话之前销毁现有会话。
replacesession_start(); 至
if(!isset($a)) { $a = False; if($a == TRUE) { session_start(); $a=TRUE; } }