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

jum4pzuy  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(446)

我有一个mysql进程生存的问题。
显示进程列表;返回进程列表。根据进程id、主机(端口),存在数小时的进程。
这个过程似乎执行了一个查询(select),而不是休眠,再次执行查询——然后它又一次发生。processlist中显示的“时间”在每次睡眠后都会重新设置。
如何让mysql自动杀掉这些进程?我假设这样一个进程在php脚本超时后仍然有效(它还执行curl任务)。
[编辑-回答评论]
查询: SELECT COUNT(*) FROM keywords WHERE updated < '2018-05-03 00:00:00' AND status = '0' AND active = '1; 列:updated(datetime)、status(int)和active(bool)被编入索引。
“关键字”表中约有120k条记录。
我的php脚本通过pdo连接到mysql。
我还设置了以下变量: interactive_timeout = 180 wait_timeout = 180

nwsw7zdq

nwsw7zdq1#

您所描述的行为只有在持久连接的情况下才可能发生。持久连接允许php在凭据匹配时重用以前的数据库连接。虽然存在缺点,但持久连接不一定是坏事,也不必手动终止它们。
如果要禁用持久连接,则必须在代码中找到初始化数据库连接的位置。应该是这样的:

<?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脚本退出后,数据库会话将无法持久。如文件所述:
连接在该pdo对象的生存期内保持活动状态。要关闭连接,您需要通过确保删除对该对象的所有剩余引用来销毁该对象—您可以通过将null赋给保存该对象的变量来完成此操作。如果不显式地执行此操作,php将在脚本结束时自动关闭连接。

相关问题