我正在构建一个允许用户针对两个数据库之一运行查询的Web应用程序。它们只允许一次向每个数据库提交1个查询。目前,我正在设置$ _SESSION ['runningAdvancedQuery'](例如),让我知道他们是否正在运行查询。这是为了防止有人打开第二个浏览器选项卡并再次点击该资源。除了......之外它很棒。
如果我在选项卡中启动查询,然后在完成之前关闭该选项卡,则不会取消设置该标志。因此,如果我重新打开页面,我无法运行任何查询,因为它认为我还有一个正在运行。任何人都有建议绕过这个?
答案 0 :(得分:1)
将此值设置为不是例如1,而是设置为unix时间戳,并通过comprasion last-query-timestamp检查到现在,设置执行下一个查询必须经过的时间差。记住将块时间设置为安全值 - 可以执行查询的最长时间。如果用户关闭他的标签,在短时间后他将被“解锁”。
答案 1 :(得分: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"
?>
答案 2 :(得分:1)
不是将$_SESSION['runningAdvancedQuery'];
设置为true,而是将其设置为SELECT CONNECTION_ID();
的输出,并检查show processlist;
是否仍在运行。这将是其他答案的补充:特别是当使用持久连接时,其他进程可能会使用connection_id。
作为同一个用户,您始终可以看到自己的流程。所以,结合其他检查:
session_write_close()
,重启会话&amp;在查询后将其设置为完成。SHOW FULL PROCESSLIST;
来获取整个查询。)可选地,更进一步,让人们有KILL QUERY <connection_id>;
的可能性(只有前3次检查都是正面的)。