Mysql_query()在PHP退出后继续运行


mysql_query() keeps running after php exits

我注意到,如果我使用mysql_query()与php执行长时间运行的mysql查询(我知道我不应该使用),然后php进程被杀死,然后查询继续在mysql服务器上运行。这不是持久连接。使用:

建立连接
$db = mysql_connect($host, $login, $pass, false);
$sql = 'SELECT COUNT(*) FROM `huge_table`';
$result = mysql_query($sql, $db);

例如,假设我有一个10亿行的表,一个php进程出于某种原因做了这个操作:

SELECT COUNT(*) FROM `huge_table`

然后它超时(因为我运行php-fpm与request_terminate_timeout=5),所以它在5秒后杀死进程,以确保它没有占用东西。

即使进程被终止,查询仍然在mysql上运行,甚至在wait_timeout之后。

是否有办法确保如果php进程退出,无论出于什么原因,它也杀死了它所做的任何正在运行的查询?

我使用的是mysql 5.5.38-tokudb-7.1.7-e

crickeys,当PHP脚本开始执行并且它到达执行MySQL查询的部分时,该查询被移交给MySQL。查询的控制不再在PHP的手中....PHP在这一点上只是等待从MySQL的响应,然后它可以继续。终止PHP脚本不会影响MySQL查询,因为查询是MySQL的业务。

换句话说,PHP找上门来,敲门,递上货物,然后等你带回一个回应,这样他就可以上路了。射杀他不会影响门后发生的事。

你可以运行这样的代码来检索运行时间最长的进程并杀死它们:

<?php
    $con=mysqli_connect("example.com","peter","pass","my_db");
// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$result = mysqli_query($con,"SHOW FULL PROCESSLIST");
while($row = mysqli_fetch_array($result)) {
if ($row["Time"] > $max_excution_time ) {
    $sql="KILL ".$row["Id"];
    mysql_query($sql);
    }   
}
mysqli_close($con); ?>

你可以使用析构函数来调用

mysql_close();函数。我希望我理解了你的问题…

您可以使用KILL

  • KILL CONNECTION与没有修饰符的KILL相同:它终止与给定thread_id相关联的连接。
  • KILL QUERY终止当前正在执行的连接语句,但不影响连接本身。

你应该在关闭事件中KILL QUERY,然后再做一个mysqli_close()


你可能会从这个问题中得到一些有价值的信息:客户端超时,而MySQL查询仍在运行?