我遇到了这个问题,我找到了很多帖子,但似乎没有用。所以我在这里再次发帖,希望有人能帮助我。
假设我有 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/