我遇到了mysql进程保持活跃的问题。
SHOW PROCESSLIST; 返回进程列表。有几个小时的进程 - 根据进程ID,主机(端口)。
似乎进程执行查询(SELECT)而不是休眠,再次执行查询 - 它再次发生。 PROCESSLIST中显示的“时间”在每次睡眠后都会保持重置状态。
如何让Mysql自动杀死这样的进程?我想这个过程在PHP脚本超时后仍然存在(它还执行CURL任务)。
[编辑 - 回答评论]
查询:
SELECT COUNT(*) FROM keywords WHERE updated < '2018-05-03 00:00:00' AND status = '0' AND active = '1;
列:更新(DATETIME),状态(INT)和活动(BOOL)是INDEXED。
“关键字”表中有~120K记录。
我的PHP脚本通过PDO连接到MySQL。
我还设置了以下变量:
interactive_timeout = 180
wait_timeout = 180
答案 0 :(得分:0)
您所描述的行为仅适用于persistent connections。持久连接允许PHP在凭据匹配时重用以前的数据库连接。虽然存在downsides,但持久连接不一定是坏事,并且没有必要手动终止它们。
如果要禁用持久连接,则必须在代码中找到初始化数据库连接的位置。看起来应该是这样的:
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
找到它后,请删除PDO::ATTR_PERSISTENT
选项或将其设置为false:
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => false
));
?>
禁用持久连接后,在退出PHP脚本后,数据库会话将无法继续存在。正如docs所述:
该连接在该PDO对象的生命周期内仍然处于活动状态。至 关闭连接,你需要通过确保销毁对象 所有剩余的引用都将被删除 - 您可以通过分配来完成此操作 对包含该对象的变量为NULL。如果你不这样做 明确地, PHP会在你的时候自动关闭连接 脚本结束。