在我的PHP代码中,如果一个会话已经开始,而我尝试启动一个新会话,则会收到以下通知:
注意:会话已经开始-忽略session_start()
如何避免这种情况?
在我的PHP代码中,如果一个会话已经开始,而我尝试启动一个新会话,则会收到以下通知:
注意:会话已经开始-忽略session_start()
如何避免这种情况?
session_start()
其中一个包含require_once
在我需要的每个文件中。
Answers:
尝试
<?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明确实现此功能:
通过新函数session_status公开会话状态这是针对(PHP> = 5.4.0)
我在尝试修复$ _SESSION的阻止行为时遇到此问题。
http://konrness.com/php5/how-to-prevent-blocking-php-requests/
在脚本完成或手动关闭会话之前,会话文件将保持锁定状态。
因此,默认情况下,页面应以只读模式打开会话。但是,一旦以只读方式打开它,就必须关闭然后重新打开它才能使其进入写入模式。
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]);
该函数采用key => value对的数组来提高效率。
以上所有都不适合,如果在所有不依赖$ Session变量的php文件中调用session_start(),它们将不包含在内。该通知太烦人了,并迅速填写Error_log。我能找到的唯一可行的解决方案是...
error_reporting(E_ALL ^ E_NOTICE);
session_start();
错误的修复程序,但它可以工作。
<?php
if ( session_id() != "" ) {
session_start();
}
基本上,您需要在创建另一个会话之前检查是否已启动一个会话。...更多阅读。
另一方面,您选择了销毁现有会话,然后使用创建另一个会话session_destroy()
。