当用户可以输入数据以查找基础中的某些产品时,我具有表单。查询具有一些并集和许多联接/子查询来正确连接数据,因此检索产品可能需要十几秒钟(最长的运行时间)。如果用户更改数据以进行搜索,并且当前正在运行一个查询时,第二次单击提交按钮,则第二个查询正在等待完成第一个查询。
当用户想要改变主意并查找其他产品时,是否可以杀死第一个正在运行的查询(而不是等待它完成)以加快搜索速度?
值得补充的是,我正在使用PDO接口来获取数据(很抱歉,我之前没有提到过)。
答案 0 :(得分:0)
对于MySQL:
看看Kill MySQL query on user abort中的@Petah答案
对于PostgreSQL:
如果您正在使用PostgreSQL数据库进行异步查询,那么有一种方法可以做到:
bool pg_cancel_query ( resource $connection )
pg_cancel_query()取消通过pg_send_query(),pg_send_query_params()或pg_send_execute()发送的异步查询。
注意:您不能取消使用pg_query()执行的查询。
答案 1 :(得分:0)
我找到了解决方案。我不知道这有多好,但现在可以工作。因此我读到(PHP Session Locking: How To Prevent Sessions Blocking in PHP requests),由于会话锁定,我无法再向MySQL发出另一个请求。使用session_write_close();
会话已关闭。
此更改之后,我可以发出第二个(或更多)请求,但是在PHPMyAdmin中执行了SHOW FULL PROCESSLIST
之后,我仍然看到运行了很长时间的进程,该进程当然仍在运行。解决方案是从会话中终止该进程,然后使用实际的进程ID重写该会话。
// make a connection
include("connection.php");
// if process id exist in session and in process list then remove
if ($_SESSION['connectionID'] != '')
{
$sql = $conn->prepare("SHOW FULL PROCESSLIST");
$sql->execute();
$resultArray = $sql->fetchAll(PDO::FETCH_ASSOC);
foreach($resultArray as $row)
{
if ($row['Id'] == $_SESSION['connectionID'])
{
$sql = $conn->prepare("KILL ".$_SESSION['connectionID']);
$sql->execute();
}
}
}
// set actual process id in the session
$sql = $conn->prepare("SELECT CONNECTION_ID()");
$sql->execute();
$resultArray = $sql->fetchAll(PDO::FETCH_ASSOC);
$_SESSION['connectionID'] = $resultArray[0]['CONNECTION_ID()'];
更改后,如果某些进程仍在运行但未被使用,它将被杀死。