【发布时间】:2011-04-01 22:14:35
【问题描述】:
如果查询没有在特定时间范围内返回,有没有办法强制 PHP 中的 Mysql 终止查询?
我有时会看到运行数小时的昂贵查询(显然此时 HTTP 连接已超时或用户已离开)。一旦积累了足够多的此类查询,它就会开始严重影响整体性能。
【问题讨论】:
-
哇,从未见过运行数小时的查询...
如果查询没有在特定时间范围内返回,有没有办法强制 PHP 中的 Mysql 终止查询?
我有时会看到运行数小时的昂贵查询(显然此时 HTTP 连接已超时或用户已离开)。一旦积累了足够多的此类查询,它就会开始严重影响整体性能。
【问题讨论】:
警告:现在应该将预期的行为与upstart 之类的东西一起使用。
你想为这类事情创建DAEMONS,但你也可以使用 cron。
只需有一个脚本查看xyz time 以上查询的设定间隔并杀死它们。
// this instruction kills all processes executing for more than 10 seconds
SELECT CONCAT('KILL ',id,';')
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE state = "executing" AND `time` >= 10
但是,如果查询运行了这么长时间...必须对其进行优化。
另一方面,您可能正在尝试管理共享服务器,并且可能存在一些流氓用户。在这种情况下,您应该在服务条款中指定脚本将被监控和禁用,而这正是对此类攻击性脚本应采取的措施。
【讨论】:
长时间运行的查询是设计不佳的标志。最好检查有问题的查询以及如何优化它们。这只是忽略了问题。
如果仍然想要这个,您可以使用 SHOW PROCESSESLIST 命令来获取所有正在运行的进程。然后使用 KILL x 终止客户端连接。但要使其工作,您必须从另一个 PHP 脚本中检查这一点,因为多线程尚无法实现。此外,不建议让 PHP 授权使用的用户弄乱服务器设置。
【讨论】: