当ajax请求中止时,如何让mysql连接关闭?

时间:2011-04-01 17:24:15

标签: jquery mysql ajax cakephp

我正在使用cakephp和jquery,以及ajax请求在选择新公司时获取mysql数据。当用户在旧公司完成加载之前选择新公司时,它将中止该请求并创建一个新公司。问题是它使mysql连接保持打开状态(很长一段时间,也许一小时)。我正在使用mysql connect的非持久版本。当用户按住向下箭头键以滚动多个选择中的公司时,它会在几秒钟内打开数百个连接,然后一切都有“连接太多”错误。

以下是我公司更改时的javascript

if ($.companiesDivXHR) {$.companiesDivXHR.abort(); }
$.companiesDivXHR = $.ajax({
    url:"/companies/details",
    success:function(html) {
        $("companiesDiv").html(html);
    }
});

另一个例子可能会有所帮助:当我每10秒钟收到一次ajax请求时,我会遇到类似情况,如果尚未完成,则会中止。当所请求的页面需要30秒左右被递送时,它在每次被显示之前被中止(从30> 10),并且再次,mysql连接被打开。当ajax请求页面自己加载时,没有问题,连接将按原样关闭。因此,效果要慢得多,但是对于1个用户,在20分钟的过程中,它会再次导致“连接太多”错误(如果最大连接数设置为100)。

2 个答案:

答案 0 :(得分:0)

  1. 您是否考虑过实施“延迟”,以便在选定一段时间(例如1秒)之前不会发出请求?

  2. 在非持久性环境中,一旦向您的PHP脚本发出请求,PHP脚本将连接到MySQL,执行其业务,并在脚本执行结束时自动关闭MySQL连接。保持这一点,调用.abort()客户端不会停止PHP脚本的执行,这意味着它不会停止关闭MySQL连接。它只是阻止浏览器等待和从PHP脚本接收任何内容。您的PHP脚本仍然必须自己完成执行,以便关闭它所使用的MySQL连接。

  3. 有几件事可能会引起您的问题:

    1. 您已启用某处的持久MySQL连接。我对CakePHP不太熟悉,无法告诉你在哪里看。

    2. 您的PHP脚本无法正常结束,在这种情况下您将等待PHP的脚本超时生效,并且在此期间MySQL连接保持打开状态,可能导致“连接太多”问题

    3. 您的MySQL服务器未设置为在如此短的时间内处理那么多请求(不太可能,但可能)。如果是这种情况,您唯一的选择是减少请求的数量(例如,实施上述延迟)

答案 1 :(得分:0)

引用PHP ignore_user_abort,看起来连接没有关闭的原因是ignore_user_abort设置为false,这是默认值。设置为true时,PHP脚本在ajax .abort()之后或在执行过程中按下转义键时继续执行。

我通过转到由ajax请求加载的页面来测试它,然后按f5然后连续转义。每次我从浏览器中止,另一个连接保持打开(在Ubuntu上使用mytop看到),并在“睡眠”模式下保持打开状态,直到达到任何超时(可能在10到60分钟之间?不确定)。当我打开ignore_user_abort时,我做了同样的事情,但每个连接只保持打开30秒,这是页面本身加载所需的时间。