【问题标题】:Stop mysql query when press stop button按下停止按钮时停止 mysql 查询
【发布时间】:2015-09-11 08:07:44
【问题描述】:

我被这个问题困住了,我发现了很多帖子,但似乎没有用。所以我再次在这里发帖,希望有人可以帮助我。

假设我有 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;
}

控制器:

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

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

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

【问题讨论】:

标签: mysql ajax


【解决方案1】:

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

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

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

Start-Request 应该包含一个会话和一个页面 id(安全 id,所以不是 3、4 和 5,而是某种不可猜测但唯一的哈希)。然后后端将这个 id 与查询连接起来。这可以在数据库的一些额外表中完成,也可以通过 SQL 查询中的 cmets 完成,例如 "Session fid98a08u4j, Page 940jfmkvlz" => s:<session>p:<page>。

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

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

然后php发送一个

kill query <id>

到 MySQL 服务器。

这可能会导致不使用事务时出现问题,并且可能会损坏复制。即使是kill query 也可能需要一些时间才能进入“杀戮”状态。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2012-07-14
    相关资源
    最近更新 更多