当用户提交具有不同数据的表单时终止第一个查询

时间:2018-07-10 18:08:07

标签: php mysql

当用户可以输入数据以查找基础中的某些产品时,我具有表单。查询具有一些并集和许多联接/子查询来正确连接数据,因此检索产品可能需要十几秒钟(最长的运行时间)。如果用户更改数据以进行搜索,并且当前正在运行一个查询时,第二次单击提交按钮,则第二个查询正在等待完成第一个查询。

当用户想要改变主意并查找其他产品时,是否可以杀死第一个正在运行的查询(而不是等待它完成)以加快搜​​索速度?

值得补充的是,我正在使用PDO接口来获取数据(很抱歉,我之前没有提到过)。

2 个答案:

答案 0 :(得分:0)

对于MySQL:

看看Kill MySQL query on user abort中的@Petah答案

对于PostgreSQL:

如果您正在使用PostgreSQL数据库进行异步查询,那么有一种方法可以做到:

pg_cancel_query()

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()'];

更改后,如果某些进程仍在运行但未被使用,它将被杀死。