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