按停止按钮时停止mysql查询

时间:2015-09-11 08:07:45

标签: mysql ajax

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

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

这是用于调用查询和获取行的函数。 (自定义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 Framework。

1 个答案:

答案 0 :(得分:2)

编辑:我没有仔细查看你的程序,现在我看到查询本身并没有花费这么长时间,而是读取所有数据。因此,如果ajax调用仍处于活动状态,则只检查每1000行。 Ajax Abort

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

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

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

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

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

然后php发送

kill query <id>

到MySQL服务器。

这可能会在不使用事务时导致问题,这可能会损害复制。甚至kill query也可能需要一段时间才能在州内杀死&#39;。

因此,请确保您可以并且不希望将长时间运行的查询拆分为子查询,这些子查询检查请求是否每隔几秒仍然有效,或者您不仅仅因为考虑因素而终止查询。