我注意到如果我使用 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 秒后终止进程以确保它不会占用任何东西。
即使进程被终止,查询仍在 mysql 上运行,甚至在 wait_timeout 很久之后。
有没有办法确保如果 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 来敲门,敲门,交出 cargo ,等你带回回应,这样他就可以上路了。射杀他不会影响门后发生的事情。
您可以运行这样的程序来检索运行时间最长的进程并杀死它们:
<?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_query() 在 php 退出后继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24901610/