退出PHP脚本后终止或停止MySQL查询

时间:2011-03-30 13:14:14

标签: php mysql

我正在运行一个统计服务器,由于在其上运行的查询数量有时变得很慢。

我们的营销团队将其用作主要统计工具。团队中的某些人有时会在脚本结束之前退出(通过关闭他们的浏览器或选项卡)。同时,SQL查询继续执行。

当有人关闭或离开此脚本时,如何终止或停止PHP脚本的关联查询?

我们当然不希望手动杀死这些查询(我们已经这样做了),但是一旦该人退出脚本就会自动终止。

我们的大多数统计脚本都是基于每天晚上为最重的人做的预先计算,而这些对我们来说没有问题。对于其他人,我们还没有实现预先计算,我们希望能够在执行之前杀死孤立查询。

5 个答案:

答案 0 :(得分:1)

您可以使用Connection Handling mechanisms检查浏览器与服务器之间的连接是否仍然打开,并做出适当的反应。

但请注意,到目前为止已启动的所有SQL查询都将运行完成 - 如果它们很复杂,这可能需要一段时间,并且没有带内方式来终止它们:你们d需要观察哪个线程运行什么并定期收获废弃的线程。

答案 1 :(得分:1)

您有时需要能够杀死持续时间过长的查询。如果你想在你的操作系统中做到这一点,你可以这样做 - 它是相当安全的,因为MySQL在子进程中运行所有这些。在Unix中,这是pskill

您也可以使用MysqlAdmin来执行此操作,并且它应该在操作系统之间基本相同。您将获得正在运行的进程列表:

$ mysqladmin processlist # password if necessary
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 2  | root | localhost |    | Query   | 0    |       | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+

然后查找mysqladmin kill以删除它们。

修改

好的,如果是关于检测浏览器已关闭,我会看到一些方法:

  1. 查看PHP的connection handling。看起来您可以注册在用户关闭浏览器时调用的句柄。
  2. 如果没有调用处理程序,也许你可以调用一个简单的“运行查询...”的插页式页面,然后该页面的呈现可以处于循环中并等待查询完成或者连接到结束。如果查询完成,请重定向到“结果”页面,如果连接断开,请手动终止查询(参见上文)。
  3. 如果这些方法毫无结果,还有另一种选择。浏览器提供了一个Javascript“on unload”事件,该事件在最近的浏览器中被触发。一个快速的Ajax帖子就可以解决长期运行的查询问题。
  4. (作业:讨论所有方法的优点和缺点。)

    这些都没有让我感到美丽,但通过一些工作,他们可以成功。说实话,当我们遇到这个问题时,我们只是保留了一个处理列表并杀死了看起来像错误查询的内容。

答案 2 :(得分:0)

最好的方法(我认为)是在使用后立即关闭连接。 还可以设置wait_timeout会话变量(例如减少到20秒);在这种情况下,连接将自动关闭。

答案 3 :(得分:0)

不幸的是,如果他们只是点击浏览器上的关闭按钮,你就无能为力了。列出已经是一些将检查会话的内置函数。也许尝试缓存最常用的查询。谷歌“缓存php mysql”。

如果这不起作用,您可以使用AJAX构建它,并且每次查询完成时 - 服务器将发回一条消息,让用户更新其请求的进度。这可能会减少放弃会话的人数。

答案 4 :(得分:0)

我的一些同事提出了以下想法:

  • 建立MySQL连接后,在SQL中获取connection_id() - CONNECTION_ID() doc on MySQL
  • 将其存储在某个变量中
  • 一旦用户退出页面(可能是通过退出或加载另一个页面),发出一个基于前一个变量触发KILL查询的js事件

我们将在接下来的几个小时内对此进行测试,我们会在确定无效后立即更新。