php退出后,mysql_query()继续运行

时间:2014-07-23 04:00:41

标签: mysql php tokudb

我注意到如果我用php使用mysql_query()执行一个长时间运行的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秒后杀死进程以确保它不会占用。

尽管进程被终止,但是在wait_timeout之后,查询仍然在mysql上运行。

无论如何要确保如果php进程因任何原因退出,它还会杀死它所做的任何正在运行的查询吗?

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

3 个答案:

答案 0 :(得分:3)

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); ?>

答案 1 :(得分:0)

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

mysql_close();功能。 我希望我理解你的问题......

答案 2 :(得分:0)

您可以使用KILL

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

您应该在关机事件中KILL QUERY,然后执行mysqli_close()


您可能会从此问题中获得有关超时的一些重要信息:Client times out, while MySQL query remains running?