【问题标题】:session_start() creates new session every refresh, no warningsession_start() 每次刷新都会创建新会话,没有警告
【发布时间】:2016-02-03 05:42:22
【问题描述】:

我遇到了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

没有警告或通知,没有,只是每次在本地服务器上显示不同的新会话 id 的消息,只有我执行此脚本。这是session_start() creates new session every refreshsession_id() creates new session every reloadPHP creating new session with each reload 的副本,但答案不适用。以下是相关的 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

【问题讨论】:

  • 为什么要投反对票?我承认,鉴于其他人被标记为重复的事实,我预计它会被否决。我不同意它们应该被标记为重复。当我看到其中一个被标记为重复时,甚至在提供答案之前,我就觉得这没有意义。嘿,消息说,if those answers do not fully address your question, please ask a new question. 这就是我们所做的,但在提供答案之前,人们一直将其标记为重复或最糟糕的否决投票,没有任何解释。
  • 有些人就是喜欢投反对票,不要太担心,除非你得到很多....

标签: php session


【解决方案1】:

好的,我想通了。很简单,session.cookie_secure = On 而我没有使用 https。因此,正如预期的那样,没有返回会话 cookie 并创建了一个新会话。不过,我觉得它可以帮助其他人看到这一点。我根本不明白为什么这些问题被标记为重复,甚至在人们有机会回答之前。鉴于显然,“重复”的问题没有令人满意的答案,因此尤其难以理解。好像这里有些人的态度是,如果有几种方法可能会出错,那就不要问为什么。在每次重新加载时重新创建会话的方法并不多。这个问题完全可以用问答的形式来解决。

【讨论】:

  • 这让我很好奇 PHP 是否有办法在不安全的域上使用 secure 标志输出错误 re: session/cookies。您是如何发现这个故障的?
  • 不知道为什么PHP没有输出E_NOTICE级别的错误。我认为它应该 - 只是一个简单的通知。甚至有人说应该弃用 http 以支持 https,这是发出此类通知的另一个原因。我通过检查所有设置发现了它,寻找 PHP 创建新会话 id 的解释。
  • 弃用 HTTP 非常复杂并且是一个非常有趣的讨论,主要是因为要使 HTTPS 工作,那么每个网站都需要自己的域 IP 地址,而根本没有足够的 IP 地址来做到这一点,所以在这里在英国,我尝试为客户获取新的 SSL 证书,但成本过高,因为可供使用的 IP 越来越少,而且 ISP 公司在实际推出 IPv6 方面非常缓慢和乏味。此外,正如 SSLQuery 实验室所说明的那样,拥有 HTTPS 并不是确保数据安全的灵丹妙药,而是一种有用的工具。我发现这一切都是一个迷人的主题!
猜你喜欢
  • 2013-04-01
  • 2014-01-15
  • 2014-09-02
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
相关资源
最近更新 更多