我有一个使用jQuery $ .getJSON方法发送到MySQL服务器的查询。服务器正在处理此查询时,我想发出一个新查询,该查询将取代上一个查询并杀死旧线程。

我已尝试从此post使用以下方法,如下所示:

var request = $.getJSON(....);
request.abort();


但是,它仅在浏览器级别实现中止功能。我需要向服务器发送kill命令,以便它不会继续查询已经中止的内容。

最佳答案

唯一的方法是发送一个新请求,该新命令命令服务器显式地了解其他请求。
但是对于我来说,我根本不认为这可以通过PHP实现。其次,如果可以的话,这意味着您必须告诉客户端有关MySQL线程的信息,以便稍后可以告知服务器要杀死哪个线程。但是,如果PHP实际上正在等待该查询,则很难使其返回该信息。挂起的不仅是MySQL进程,还有PHP进程。

MySQLi得以解救。
如果使用MySQLi,则可以调用mysqli_kill,它接受一个进程ID。这是您连接到MySQL时获得的线程。调用mysqli_thread_id获取此ID。

存储线程ID。
如果您将此ID存储在会话中,则可以在下一个请求中获取该ID并将其杀死。但是,恐怕会话可能不会被先前的请求保存(因为它仍在运行),因此线程ID可能尚未存储。

如果确实如此,则可以使第一个请求将线程ID存储在内存缓存或另一个表中(一个内存表可以)。使用会话ID作为密钥。然后,在您的终止请求中,您可以使用会话ID查找线程ID并终止另一个请求。

不针对第一个请求
如果这是第一个挂起的请求,这只会造成问题,因为在这种情况下,您还没有会话。

(我假设PHP也可能是另一个服务器进程。无论如何,不​​是JavaScript直接连接到MySQL)。

07-24 16:36
查看更多