我有一个问题session_start()。它会在每次刷新/加载页面时创建一个新会话。
这是执行的完整脚本的代码:
// Stuff added to see why a new session id is created.
ini_set(display_errors, 1);
error_reporting(E_ALL);
$session_dir = session_save_path();
$last_session_id = file_get_contents("$session_dir/last_session_id.txt");
$message = "Last session id : $last_session_id. -- ";
if(!is_writable($session_dir)) $message .= "Directory $session_dir is not writable. --";
if(headers_sent($file, $line)) $message .= "Headers already sent at $line in $file. --";
// The code just start a session and output a message to see what is going on.
if (!session_start()) {
$message .= "Failed to start the session. --";
}
else
{
$message .= "New session id : " . session_id() . "<br>";
file_put_contents("$session_dir/last_session_id.txt", session_id());
}
echo $message; // Last session id : hh3isj5cc1b964itlgek89vm13. -- New session id : 6hss2s8v340n5qad0smbmmlfm3
Run Code Online (Sandbox Code Playgroud)
在本地服务器上,只有我执行此脚本,没有警告或通知,什么也没有,只是每次显示不同的新会话ID的消息。这是session_start()的副本,每次刷新都会创建新的会话, session_id()每次重新加载都会创建新的会话, PHP 每次重新加载都会创建新的会话,但是答案不适用。以下是相关的php.ini设置:
session.save_handler = files
session.save_path = "/var/www/html/php_session"
session.use_strict_mode = Off
session.use_cookies = 1
session.cookie_secure = On
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly = On
session.serialize_handler = php
Run Code Online (Sandbox Code Playgroud)
小智 5
好的,我知道了。就是这样session.cookie_secure = On,我没有使用https。因此,正如预期的那样,没有返回任何会话cookie,而是创建了一个新会话。不过,我认为它可以帮助其他人看到这一点。我什至不明白为什么即使在人们有机会回答之前,这些问题仍被标记为重复。鉴于“重复的”问题显然没有令人满意的答案,因此很难理解。好像这里的某些人有这样的态度,如果某些事情可能以某种方式出错,那么不要问为什么。在每次重新加载时,没有太多方法可以重新创建会话。可以以问答形式很好地解决这个问题。