mysql - 按停止按钮时停止 mysql 查询

标签 mysql ajax

我遇到了这个问题,我找到了很多帖子,但似乎没有用。所以我在这里再次发帖,希望有人能帮助我。

假设我有 2 个按钮,1 个是“开始”按钮,1 个是“停止”按钮。当我按下开始时,将调用ajax函数,该函数查询时间很长。我需要当我按“停止”时立即停止该查询,不再执行。

这是用于调用查询和获取行的函数。 (自定义Mysqli.php)

public function fetchMultiRowset($params = array()) {
    $data = array();
    $mysqli = $this->_adapter->getConnection();
    $mysqli->multi_query($this->bindParams($this->_sql, $params));
    $thread_id = mysqli_thread_id($mysqli);
    ignore_user_abort(true);
    ob_start();
    $index = 0;
    do {
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
                $data[$index] = $row;
                $index++;
                echo " ";
                ob_flush();
                flush();
            }
            $result->free();
        }
    }
    while ($mysqli->more_results() && $mysqli->next_result());
    ob_end_flush();
    return $data;
}

模型中的函数:

public function select_entries() {
    $data = null;
    try {
        $db = Zend_Db_Adapter_Mysqlicustom::singleton();
        $sql = "SELECT * FROM report LIMIT 2000000";
        $data = $db->fetchMultiRowset($sql);
        $db->closeConnection();
    } catch (Exception $exc) {
    }
    return $data;
}

Controller :

public function testAction(){
    $op = $this->report_test->select_entries();
}

在 AJAX 中,我使用 xhr.abort() 来停止 AJAX 功能。但在 AJAX 中止时它仍然运行查询。

如何停止查询?我使用 Zend 框架。

最佳答案

编辑:我没有详细查看您的程序,现在我发现不是查询本身花费了这么长时间,而是读取了所有数据。因此,只需每 1000 行检查一次 ajax 调用是否仍处于事件状态。 Ajax Abort .

长时间运行 SQL 查询的解决方案:

您必须允许应用程序终止数据库查询,并且需要在客户端和服务器之间实现更复杂的交互,如果操作不当,可能会导致安全漏洞。

开始请求应包含一个 session 和一个页面 ID(安全 ID,因此不是 3、4 和 5,而是某种不可猜测但唯一的哈希值)。然后后端将此 id 与查询连接起来。这可以在数据库的一些额外表中完成,也可以通过 SQL 查询中的注释来完成,例如“Session fid98a08u4j, Page 940jfmkvlz” => s:<session>p:<page> .

/* s:fid98a08u4jp:940jfmkvlz */ select * from ...

如果用户按下“停止”,您将向服务器发送 session 和页面 ID。然后,php 代码会获取正在运行的 SQL 查询的列表,搜索 session 和页面并提取查询 ID。

然后 php 发送一个

kill query <id>

到 MySQL 服务器。

在不使用事务时这可能会导致问题,并且可能会损坏复制。甚至还有kill query可能需要一段时间才能处于“杀戮”状态。

因此,请确保您可以并且不想将长时间运行的查询拆分为子查询,子查询每隔几秒检查一次请求是否仍然有效,或者您不只是想出于美观原因终止查询。

关于mysql - 按停止按钮时停止 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32518601/

相关文章:

javascript - 使用 rails 中的 delete 方法单击 link_to 时创建自定义 jquery 确认对话框

mysql - C 树数据库中出现错误

mysql - .mys.utf8.sql 扩展名是什么?

php - 如果返回设置为 false 以防止重定向,则使用 jQuery 和 AJAX 提交的表单不会将值插入 SQL

php - jquery 整数 post ajax php -> 无法识别的表达式 0

在浏览器中使用 Javascript 下载文档。网页接口(interface)

mysql - 删除列中字符串的一部分

MySQL 字段 MS-1 到 ms0001

Php, MySql 从两个表求和

PHP AJAX Comet 与 MySQL 选择记录