我正在使用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)。
答案 0 :(得分:0)
您是否考虑过实施“延迟”,以便在选定一段时间(例如1秒)之前不会发出请求?
在非持久性环境中,一旦向您的PHP脚本发出请求,PHP脚本将连接到MySQL,执行其业务,并在脚本执行结束时自动关闭MySQL连接。保持这一点,调用.abort()
客户端不会停止PHP脚本的执行,这意味着它不会停止关闭MySQL连接。它只是阻止浏览器等待和从PHP脚本接收任何内容。您的PHP脚本仍然必须自己完成执行,以便关闭它所使用的MySQL连接。
有几件事可能会引起您的问题:
您已启用某处的持久MySQL连接。我对CakePHP不太熟悉,无法告诉你在哪里看。
您的PHP脚本无法正常结束,在这种情况下您将等待PHP的脚本超时生效,并且在此期间MySQL连接保持打开状态,可能导致“连接太多”问题
您的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秒,这是页面本身加载所需的时间。