我正在运行一个统计服务器,由于在其上运行的查询数量有时变得很慢。
我们的营销团队将其用作主要统计工具。团队中的某些人有时会在脚本结束之前退出(通过关闭他们的浏览器或选项卡)。同时,SQL查询继续执行。
当有人关闭或离开此脚本时,如何终止或停止PHP脚本的关联查询?
我们当然不希望手动杀死这些查询(我们已经这样做了),但是一旦该人退出脚本就会自动终止。
我们的大多数统计脚本都是基于每天晚上为最重的人做的预先计算,而这些对我们来说没有问题。对于其他人,我们还没有实现预先计算,我们希望能够在执行之前杀死孤立查询。
答案 0 :(得分:1)
您可以使用Connection Handling mechanisms检查浏览器与服务器之间的连接是否仍然打开,并做出适当的反应。
但请注意,到目前为止已启动的所有SQL查询都将运行完成 - 如果它们很复杂,这可能需要一段时间,并且没有带内方式来终止它们:你们d需要观察哪个线程运行什么并定期收获废弃的线程。
答案 1 :(得分:1)
您有时需要能够杀死持续时间过长的查询。如果你想在你的操作系统中做到这一点,你可以这样做 - 它是相当安全的,因为MySQL在子进程中运行所有这些。在Unix中,这是ps
和kill
。
您也可以使用MysqlAdmin来执行此操作,并且它应该在操作系统之间基本相同。您将获得正在运行的进程列表:
$ mysqladmin processlist # password if necessary
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+----+---------+------+-------+------------------+
| 2 | root | localhost | | Query | 0 | | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+
然后查找mysqladmin kill
以删除它们。
修改的
好的,如果是关于检测浏览器已关闭,我会看到一些方法:
(作业:讨论所有方法的优点和缺点。)
这些都没有让我感到美丽,但通过一些工作,他们可以成功。说实话,当我们遇到这个问题时,我们只是保留了一个处理列表并杀死了看起来像错误查询的内容。
答案 2 :(得分:0)
最好的方法(我认为)是在使用后立即关闭连接。 还可以设置wait_timeout会话变量(例如减少到20秒);在这种情况下,连接将自动关闭。
答案 3 :(得分:0)
不幸的是,如果他们只是点击浏览器上的关闭按钮,你就无能为力了。列出已经是一些将检查会话的内置函数。也许尝试缓存最常用的查询。谷歌“缓存php mysql”。
如果这不起作用,您可以使用AJAX构建它,并且每次查询完成时 - 服务器将发回一条消息,让用户更新其请求的进度。这可能会减少放弃会话的人数。
答案 4 :(得分:0)
我的一些同事提出了以下想法:
我们将在接下来的几个小时内对此进行测试,我们会在确定无效后立即更新。