我注意到如果我用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
答案 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 CONNECTION
与KILL
相同,没有修饰符:它终止与给定thread_id关联的连接。KILL QUERY
终止连接当前正在执行的语句,但保持连接本身不变。
您应该在关机事件中KILL QUERY
,然后执行mysqli_close()
。
您可能会从此问题中获得有关超时的一些重要信息:Client times out, while MySQL query remains running?