mysql进程保持活着 - 为什么?

时间:2018-05-02 23:10:49

标签: php mysql pdo process

我遇到了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

1 个答案:

答案 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会在你的时候自动关闭连接   脚本结束