Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP和AJAX在执行过程中终止MySQL查询_Php_Mysql_Ajax - Fatal编程技术网

使用PHP和AJAX在执行过程中终止MySQL查询

使用PHP和AJAX在执行过程中终止MySQL查询,php,mysql,ajax,Php,Mysql,Ajax,我正在创建一个自定义查询生成器,当用户创建了他的查询时,他可以通过单击按钮来验证查询语法。当用户单击按钮进行验证时,将向服务器发送一个AJAX调用,查询将开始执行,在此期间,用户可以通过取消按钮在屏幕上看到一个模式。如果用户碰巧单击了cancel按钮,我希望向服务器发送另一个AJAX调用以终止查询的执行 目前我只能终止我最初发送的AJAX调用,我的页面在用户端运行良好 但是我正在寻找一个PHP代码来停止服务器端的MYSQL查询,因为有些查询可能非常繁重并且运行很长时间。不可能,因为每次执行结束时

我正在创建一个自定义查询生成器,当用户创建了他的查询时,他可以通过单击按钮来验证查询语法。当用户单击按钮进行验证时,将向服务器发送一个AJAX调用,查询将开始执行,在此期间,用户可以通过取消按钮在屏幕上看到一个模式。如果用户碰巧单击了cancel按钮,我希望向服务器发送另一个AJAX调用以终止查询的执行

目前我只能终止我最初发送的AJAX调用,我的页面在用户端运行良好


但是我正在寻找一个PHP代码来停止服务器端的MYSQL查询,因为有些查询可能非常繁重并且运行很长时间。不可能,因为每次执行结束时都要关闭连接。无法(通过PHP)控制旧的“会话”(连接)

首先,如果查询的目的只是检查语法,请不要执行它!执行explain,或添加限制0,或对空数据库执行

至于KILL,您必须以root权限连接到数据库,并发出KILL命令(但您需要知道查询id)。或者你可以杀死整个线程。看看


编辑:似乎您不需要root权限,要查看用户的查询,请使用SHOW PROCESSLIST命令

我相信报告的线程id与…中使用的线程id相同

在开始查询之前,您需要捕获连接的进程id

$qry="SELECT CONNECTION_ID() AS c";
$row=mysql_fetch_assoc(mysql_query($qry));
$_SESSION['mysql_connection_id']=$row['c'];
然后,当用户单击按钮时,执行如下操作

exec('mysqladmin -u $user -p$password killproc ' 
          . $_SESSION['mysql_connection_id']);

但这也增加了用户杀死其他人的查询的可能性。您可以在每个查询的开始处插入注释键,例如php会话id(mysqladmin截断查询文本),然后使用mysqladmin processlist检查所有权和/或在终止前检索线程id。

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

启动请求应该包含一个会话和一个页面id(安全id,所以不是3、4和5,而是某种不可猜测但唯一的散列)。后端然后将此id与查询连接。这可以在数据库的某个额外表中完成,如果您有redis,也可以通过redis方式完成,但也可以通过SQL查询中的注释完成,如“会话fid98a08u4j,第940jfmkvlz页”=>
s:p:

如果用户按“取消”,则向服务器发送带有会话和页面id的取消请求。然后,php代码使用
show processlist
获取正在运行的SQL查询列表,并搜索会话和页面以提取查询id

然后php发送一个

kill query <id>
kill查询
到MySQL服务器

这可能会在不使用事务时导致问题,并且可能会损坏复制。即使是
kill查询
也可能需要一段时间才能进入“killing”状态


因此,这应该是几种变体中最后一种。但有时必须这样做,我甚至有一个程序,你可以列出你自己正在运行的查询来终止它们,这是因为“配额”(你不能同时运行两个或三个以上的报告请求)的缘故,但是,如果您的db用户允许这样做,您可以发出“kill process_id”命令。但是您必须知道进程id,除非您执行一些肮脏的技巧,例如将用户id作为注释附加到每个sql或类似的东西,否则这是不可能的。是的,这可能是不安全的,您可能会终止由其他用户启动的连接或造成其他安全隐患。phpmyadmin做到了…这应该是可能的…我已经在使用限制1,但我只是想寻找一种方法来实际终止查询,但我将继续使用它:)但有一个问题。。限制1和限制0之间有什么区别吗?有区别,因为限制0 MySQL不会实际执行查询(优化器会告诉不可能的where子句),也不会实际从磁盘读取任何行。无论如何,它不会比限制1慢,它只能更快:)快多少-最好的检查,因为它取决于很多条件,但我不能冒险终止整个过程。这只是一个额外的要求,所以我想看看是否有一个简单的方法来做。嗯?该线程只会运行查询的一个实例-风险在于后续请求可能会使用相同的线程id创建线程。而您并不是在“终止…进程”,而是在要求mysqld终止查询。嗯。。有意思。。我将仔细查看代码thanx:)
kill query <id>