数据库
首页 > 数据库> > php退出后,mysql_query()继续运行

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

作者:互联网

我注意到,如果我使用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`

然后它超时(例如,因为我运行的是带有request_terminate_timeout = 5的php-fpm),所以它在5秒钟后杀死了该进程,以确保它不会占用大量资源.

尽管该进程被终止,但即使在wait_timeout之后,查询仍然在mysql上运行.

无论如何,要确保如果php进程由于某种原因退出,它也会杀死它发出的任何正在运行的查询?

我正在使用tokudb 5.5.38-tokudb-7.1.7-e这是mysql 5.5.38

解决方法:

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

标签:tokudb,mysql,php
来源: https://codeday.me/bug/20191121/2051993.html