【问题标题】:php session problems when opening multiple window tabs打开多个窗口选项卡时的php会话问题
【发布时间】:2012-09-01 13:20:55
【问题描述】:

我有一个以 session_start() 开头的 php 页面,它将用户信息存储在会话变量中。之后,它进入 (1) 长循环脚本进行计算或 (2) 数据查询部分,具体取决于来自先前表单提交的 _POST 数据。

即使脚本仍在循环并在另一个窗口中获取数据,我也想做一些查询。因此,我将有 2 个窗口选项卡,它们分别具有 (1)、(2) 相同的 php 页面。

问题是,除非我在执行 (1) 时和循环脚本之前使用 session_destroy(),否则这是无法完成的。否则 (2) 将被加载并且无法打开。我真的不想破坏会话,否则用户将不得不一次又一次地登录。那可能吗?谢谢。

ps:当我执行 (1) 并打开一个隐身窗口执行 (2) 时。即使没有 session_destory(),我也没有这个问题。

代码如下所示:

<?php 

session_start();

echo "<form method='post'>
<input type='submit' id='one' name='one' value='one'>
<input type='submit' id='two' name='two' value='two'>
</form>";

$if_one = $_POST["one"];
$if_two = $_POST["two"];
if ($if_one) loop();
if ($if_two) query();

function loop()
{
    //session_destroy();
    $y = 0;

    for ($i=0; $i<20000000; $i++)
    {
         $y += ($i * $i) % 5;
    }
    echo $y;
}

function query()
{
    echo '222';
}

?>

【问题讨论】:

  • 我发现如果一个人发布代码更容易遵循逻辑过程,考虑到代码或多或少是逻辑。
  • 究竟为什么需要使用session_destroy?是否在长循环之前发送了 cookie/标头?如果不是,则问题是会话尚未开始,从某种意义上说,浏览器具有要带到新窗口的会话 ID。
  • 我可以同时查询 (1) 循环是在我销毁会话时。我会尝试发布一个简短的代码。

标签: php session


【解决方案1】:

我想我刚刚解决了它。而不是使用session_destroy()session_write_close() 可以解决这个问题。

【讨论】:

    【解决方案2】:

    你不需要这样做,

    当你调用 session_start();创建了一个会话,并且它一直处于活动状态,直到 php.ini 中的超时或您调用 session_destroy();

    您的错误在其他地方,您是在 echo 或 print 之后调用 session_start 吗?

    【讨论】:

    • session_start() 是我的php文件的第一行。@@
    • @Chandler - “长循环”是在回显或打印之前还是之后开始的?
    【解决方案3】:

    听起来问题不在于多个窗口中的会话,而是第一个脚本在输出任何标题之前运行长循环,特别是其他页面使用同一会话所需的会话 ID cookie。您可能应该启动会话并存储变量,然后将用户重定向到另一个页面以进行长循环或输出某种内容,例如“欢迎!开始长循环...”

    【讨论】:

    • 我现在正试图将其保留在同一页面中。但这似乎是可行的,如果我的问题无法解决,我会尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多