2010-07-28 64 views
0

我正在构建一个Web应用程序,允许用户针对两个数据库之一运行查询。它们一次只允许向每个数据库提交一个查询。目前,我设置$ _SESSION ['runningAdvancedQuery'](例如)让我知道他们是否正在运行查询。这是为了防止某人打开第二个浏览器选项卡并再次点击该资源。它的工作原理只是......在PHP中的浏览器选项卡之间维护状态

巨大的,如果我开始在选项卡中的查询,然后关闭该选项卡完成之前,该标志没有得到取消设置。因此,如果我重新打开该页面,我无法运行任何查询,因为它认为我仍然有一个正在运行。任何人都有解决这个问题的建议?

+0

你何时清除$ _SESSION ['runningAdvancedQuery']? – ankitjaininfo 2010-07-28 19:53:36

+0

AJAX调用来自浏览器以启动查询。完成后,另一个AJAX调用将检索并显示结果。显示结果后,标志未设置。 – Derek 2010-07-28 19:56:03

+0

你在线程中运行查询吗?或者仍然有待处理的Ajax呼叫。 – ankitjaininfo 2010-07-28 20:01:14

回答

1

将此值不是例如1,但UNIX时间戳,也由去年comprasion查询时间戳检查到现在为止,设置了一些时间差必须去通过执行一个查询。记住将块时间设置为安全值 - 可以执行最长的查询时间。如果用户关闭了他的标签,短时间后他将被“解锁”。

+0

这可以工作,但我可以看到客户抱怨不得不等待。而且,查询时间高度可变。 – Derek 2010-07-28 20:24:30

+0

也许尝试检测关闭标签: http://www.php.net/manual/en/features.connection-handling.php – 2010-07-28 20:41:43

+0

这是超过实际的答案评论。您提供的链接引导我学习到: “下次您的脚本尝试输出某些内容时,PHP将检测到连接已中止,并且关闭功能被调用” 在关闭功能中执行操作似乎可以我需要什么(特别是因为脚本不会终止,直到查询结束) – Derek 2010-07-28 21:36:24

1
<?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" 

?> 
1

而不是设置$_SESSION['runningAdvancedQuery'];为true,您可以将其设置为SELECT CONNECTION_ID();输出,并检查show processlist;是否仍在运行。尽管如此,这将成为其他答案的插件:特别是在使用持久连接时,其他进程可以使用connection_id。

相同的用户,你总是被允许看你自己的过程。因此,在其他检查相结合:

  1. 商店时间戳,CONNECTION_ID &实际的SQL查询(我会删除所有空白&投给上或下的字符串,以避免在呈现轻微差异无关紧要)。
  2. 当然使用ignore_user_abort()功能,查询前做一个session_write_close(),重新启动会话&将其设置为查询后完成。
  3. 检查运行的查询,检查是否
    • connection-id仍然存在。
    • 查询运行的时间戳+秒相当接近当前时间。
    • 查询(小写,剥离空白)大约是相同的查询的要求(使用SHOW FULL PROCESSLIST;得到整个查询)。

可选,走了一步,给人民的可能性KILL QUERY <connection_id>;(仅在前3个检查所有产生了积极的)。

相关问题