我遇到了这个问题,我发现很多帖子,但似乎没用。所以我在这里再次发帖,希望有人可以帮助我。
假设我有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。
答案 0 :(得分:2)
长时间运行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;。
因此,请确保您可以并且不希望将长时间运行的查询拆分为子查询,这些子查询检查请求是否每隔几秒仍然有效,或者您不仅仅因为考虑因素而终止查询。