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