代码之家  ›  专栏  ›  技术社区  ›  Derek

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

  •  0
  • Derek  · 技术社区  · 15 年前

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

    如果我在一个选项卡中开始一个查询,然后在它完成之前关闭该选项卡,标志不会被取消设置。因此,如果我重新打开页面,我将无法运行任何查询,因为它认为我仍在运行一个查询。有人有什么建议可以绕过这件事吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Piotr Müller    15 年前

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

        2
  •  1
  •   thirtydot    15 年前
    <?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"
    
    ?> 
    
        3
  •  1
  •   Wrikken    15 年前

    而不是设置 $_SESSION['runningAdvancedQuery']; 如果为true,可以将其设置为 SELECT CONNECTION_ID(); ,并检查 show processlist; 是否还在运行。不过,这将是其他答案的附加组件:特别是在使用持久连接时,其他进程可能会使用连接id。

    作为同一个用户,您始终可以看到自己的流程。所以,要合并其他检查:

    1. 存储时间戳、连接id和实际的sql查询(我将删除所有空格,并将其转换为上下字符串,以避免表示方式上的细微差异)。
    2. 当然,使用ignore_user_abort()功能,执行 session_write_close() 在查询之前,请重新启动会话,并在查询之后将其设置为finished。
    3. 在检查正在运行的查询时,检查
      • 连接id仍然存在。
      • 时间戳+查询运行的秒数与当前时间相当接近。
      • 查询(小写,带空格)与请求的查询(使用 SHOW FULL PROCESSLIST; 获取整个查询)。

    或者,更进一步,让人们有可能 KILL QUERY <connection_id>; (仅当前3次检查均为阳性时)。

    推荐文章