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

标签 mysql php tokudb

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

相关文章:

php - 从 mysql 数据库获取日期数组?

mysql - 如何使用 tokudb 每秒执行超过 50.000 次插入?

mysql - 记录平均长度为3k时是否适合使用TokuDB引擎?

php - 分析用户之间相互喜欢的表

mysql - Sphinx 索引器错误 : index 'PhoneNumbers2' : Error writing file '/tmp/MYbP6cIt' (Errcode: 28)

mysql - 突然我收到错误 #1366,因为我的列没有默认值

php - 将多维数组的值存储到变量中

javascript - 如何在JavaScript测验App中问问题5次?

php - 截断从 MySql (PHP) 传递到表单的数据

mysql - 改进mysql加载数据