在PHP中维护浏览器选项卡之间的状态

在PHP中维护浏览器选项卡之间的状态,php,session,Php,Session,我正在构建一个web应用程序,允许用户对两个数据库中的一个运行查询。他们一次只能向每个数据库提交一个查询。目前,我正在设置$_SESSION['runningAdvancedQuery'](例如)让我知道他们是否正在运行查询。这是为了防止有人打开第二个浏览器选项卡并再次点击资源。它工作得很好,除了 如果在某个选项卡中启动查询,然后在该选项卡完成之前关闭该选项卡,则该标志不会取消设置。因此,如果我重新打开页面,我无法运行任何查询,因为它认为我还有一个查询在运行。有没有人对此有什么建议?将此值设置为

我正在构建一个web应用程序,允许用户对两个数据库中的一个运行查询。他们一次只能向每个数据库提交一个查询。目前,我正在设置$_SESSION['runningAdvancedQuery'](例如)让我知道他们是否正在运行查询。这是为了防止有人打开第二个浏览器选项卡并再次点击资源。它工作得很好,除了


如果在某个选项卡中启动查询,然后在该选项卡完成之前关闭该选项卡,则该标志不会取消设置。因此,如果我重新打开页面,我无法运行任何查询,因为它认为我还有一个查询在运行。有没有人对此有什么建议?

将此值设置为unix时间戳,而不是示例1,并通过压缩上一个查询时间戳到现在来进行检查,设置执行下一个查询时必须经过的时差。请记住将块时间设置为安全值—可以执行查询的最长时间。如果用户关闭选项卡,在短时间后,他将被“解锁”。

将此值设置为unix时间戳,而不是示例1,并通过压缩上一个查询时间戳到现在进行检查,设置执行下一个查询必须经过的时差。请记住将块时间设置为安全值—可以执行查询的最长时间。如果用户关闭选项卡,在短时间后,他将被“解锁”。

而不是设置
$\u会话['runningAdvancedQuery']
为true,您可以将其设置为
SELECT CONNECTION_ID()的输出
,并选中
显示进程列表是否仍在运行。不过,这是对其他答案的补充:特别是在使用持久连接时,其他进程可能会使用连接id

作为同一用户,始终允许您查看自己的流程。因此,要结合其他检查:

  • 存储时间戳、连接id和实际的sql查询(我会删除所有空白并转换为上下字符串,以避免在表示上的细微差异)
  • 当然,使用ignore\u user\u abort()功能,在查询之前执行
    会话\u write\u close()
    ,重新启动会话并在查询之后将其设置为finished
  • 在检查正在运行的查询时,检查
    • 连接id仍然存在
    • 时间戳+查询运行的秒数与当前时间相当接近
    • 查询(小写,带空格)与请求的查询大致相同(使用
      showfullprocesslist;
      获取整个查询)

  • 或者,更进一步,让人们能够
    KILL查询(仅当前3次检查全部结果为正时)。

    而不是设置
    $\u会话['runningAdvancedQuery']
    为true,您可以将其设置为
    SELECT CONNECTION_ID()的输出
    ,并选中
    显示进程列表是否仍在运行。不过,这是对其他答案的补充:特别是在使用持久连接时,其他进程可能会使用连接id

    作为同一用户,始终允许您查看自己的流程。因此,要结合其他检查:

  • 存储时间戳、连接id和实际的sql查询(我会删除所有空白并转换为上下字符串,以避免在表示上的细微差异)
  • 当然,使用ignore\u user\u abort()功能,在查询之前执行
    会话\u write\u close()
    ,重新启动会话并在查询之后将其设置为finished
  • 在检查正在运行的查询时,检查
    • 连接id仍然存在
    • 时间戳+查询运行的秒数与当前时间相当接近
    • 查询(小写,带空格)与请求的查询大致相同(使用
      showfullprocesslist;
      获取整个查询)

  • 或者,更进一步,让人们能够
    KILL查询(仅当前3次检查全部结果为肯定时)。

    何时清除$\u会话['runningAdvancedQuery']?浏览器会发出AJAX调用以启动查询。完成后,进行另一个AJAX调用以检索并显示结果。显示结果后,该标志未设置。是否在线程中运行查询?或者Ajax调用仍处于挂起状态。Ajax调用将继续运行。何时清除$\u会话['runningAdvancedQuery']?从浏览器发出Ajax调用以启动查询。完成后,进行另一个AJAX调用以检索并显示结果。显示结果后,该标志未设置。是否在线程中运行查询?或者Ajax调用仍然挂起。Ajax调用继续运行。这可以工作,但我可以看到客户端抱怨必须等待。此外,查询时间也是高度可变的。也许可以尝试检测关闭选项卡:它更多的是注释而不是实际答案。您提供的链接让我了解到:“下次脚本尝试输出内容时,PHP将检测到连接已中止,关闭函数被调用”执行关闭函数中的操作似乎是我所需要的(特别是因为脚本在查询完成之前不会终止)没关系,说得太早了。函数connection_aborted()不断返回0…这可能有效,但我可以看到客户端抱怨必须等待。此外,查询时间也是高度可变的。也许可以尝试检测关闭选项卡:它更多的是注释而不是实际答案。您提供的链接让我了解到:“下次脚本尝试输出内容时,PHP将检测到连接已中止,关闭函数被调用”执行关闭函数中的操作似乎是我所需要的(特别是因为脚本在查询完成之前不会终止)没关系,我也这么说
    <?php
    ignore_user_abort(true);
    
    //if session variable is not set
        //set session variable
        //run query
        //unset session variable
    //else
        //show error: "your other query isn't finished yet"
    
    ?>