我注意到,如果我使用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查询仍在运行?