我有一个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
1条答案
按热度按时间nwsw7zdq1#
您所描述的行为只有在持久连接的情况下才可能发生。持久连接允许php在凭据匹配时重用以前的数据库连接。虽然存在缺点,但持久连接不一定是坏事,也不必手动终止它们。
如果要禁用持久连接,则必须在代码中找到初始化数据库连接的位置。应该是这样的:
一旦你找到它,要么移除
PDO::ATTR_PERSISTENT
选项或将其设置为false:禁用持久连接后,在php脚本退出后,数据库会话将无法持久。如文件所述:
连接在该pdo对象的生存期内保持活动状态。要关闭连接,您需要通过确保删除对该对象的所有剩余引用来销毁该对象—您可以通过将null赋给保存该对象的变量来完成此操作。如果不显式地执行此操作,php将在脚本结束时自动关闭连接。