【问题标题】:PHP session_id regenerated on refresh刷新时重新生成 PHP session_id
【发布时间】:2015-02-02 02:09:14
【问题描述】:

我在使用 session_id() 时遇到问题,它每次在浏览器刷新/重新启动时都会返回一个新值。

阅读这篇文章here,但它并没有解决问题。我做了那里提到的所有事情 - 浏览器接受 cookie,权限设置正确,连续请求不会更改参数值等。

这是否可以称为未正确使用session_name()session_set_cookie_params()?或者可能是应该微调的初始配置?

public static function init_session($name = FALSE, $lifetime = 10, $path = '/', $domain = FALSE, $secure = FALSE)   
{
    if (empty($name))
    {
        $name = APP_NAME;
    }

    if (empty($domain))
    {
        $domain = BASE_URL;
    }

    session_name($name);

    session_set_cookie_params($lifetime, $path, $domain, $secure, TRUE);

    session_start();

    echo session_id();
}

【问题讨论】:

  • 我认为您发布了错误的链接,我没有看到与 CSS3 问题的关系。
  • @MarcelBurkhard 抱歉,现已修复。
  • 评论对session_name()session_set_cookie_params()的调用,看看它是否有效。如果它有效,则取消注释两个调用之一,再次检查,依此类推。当它停止工作时,您就发现了问题。
  • 尽量不要混合变量$name的数据类型。您将其初始化为布尔值,然后为其设置一个字符串值。最好在函数签名中使用$name = ''
  • @Chris 这应该没问题。我认为您需要它,以便 empty() 调用正常工作

标签: php session session-cookies


【解决方案1】:

首先,您将 会话生命周期 设置为 10 秒,这意味着您每 10 秒后获得一个新会话。

附注:某些浏览器在关闭浏览器时丢弃会话cookie是正常行为。

如果您需要将会话扩展到多个浏览器会话,则需要使用持久性 cookie

例子:

function init_session(/* ... */)
{
    if(!isset($_SESSION)) {
        session_start();
    }
    //Is it a running session?
    if(isset($_SESSION['somevalue'])) {
        //Everything is fine, session is loaded, no need to reload from cookies
    } else {
        if(isset($_COOKIE['yourcookiename'])) {
            //reload session from cookie
        } else {
            create_session();
        }
    }
}

function create_session()
{
    $_SESSION['somevalue'] = 1;
    //setcookie
}

阅读http://www.allaboutcookies.org/cookies/cookies-the-same.html

【讨论】:

  • 附带事实:浏览器本身不会关闭会话,因为当您关闭页面选项卡时浏览器不会与服务器通信。关闭本身在超时后发生在服务器端(因此当用户浏览器在 X 秒内没有请求时,会话将关闭)!
  • @MarcelBurkhard 是的,但是 session_id 在每次请求时都会更改,即使间隔更短。不知何故,“生存时间”被忽略了。
  • 为什么少?试试 $lifetime = 100000
  • 或者试试这个:php.net/manual/en/function.session-set-cookie-params.php#100657 正如我所说,不是会话 cookie,而是持久性 cookie。
  • @MarcelBurkhard session_name 和 session_set_cookie_params 方法都不适合我。当我关闭 session_name 时,不会创建新会话(这很好),通过关闭 session_set_cookie_params 最终会在我的浏览器上创建 cookie。 session_set_cookie_params 不起作用,例如没有考虑 $lifetime,也没有创建 cookie。
猜你喜欢
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 2021-04-06
相关资源
最近更新 更多