Php 如何中断挂起的ajax调用并加载另一个页面

Php 如何中断挂起的ajax调用并加载另一个页面,php,jquery,ajax,session,Php,Jquery,Ajax,Session,我正在开发一个发票应用程序。目前我正在使用OO php构建发票对象。 对象本身包含客户、产品、发票详细信息和公司的对象 现在我正在写一页来做一个概述。出现的问题是,当我有太多发票时(仅使用1500个虚拟发票进行测试,时间可能会多得多),构建php对象大约需要7秒钟。我觉得这太长了,因为这只是一个请求。此外,由于php运行服务器端,因此在构建所有对象之前,页面没有加载任何内容。 我盯着一个空屏幕看了7秒钟,然后在一瞬间就得到了一切(都在本地主机上,所以在线应该更糟糕) 由于页面需要更多功能,然后只

我正在开发一个发票应用程序。目前我正在使用OO php构建发票对象。 对象本身包含客户、产品、发票详细信息和公司的对象

现在我正在写一页来做一个概述。出现的问题是,当我有太多发票时(仅使用1500个虚拟发票进行测试,时间可能会多得多),构建php对象大约需要7秒钟。我觉得这太长了,因为这只是一个请求。此外,由于php运行服务器端,因此在构建所有对象之前,页面没有加载任何内容。 我盯着一个空屏幕看了7秒钟,然后在一瞬间就得到了一切(都在本地主机上,所以在线应该更糟糕)

由于页面需要更多功能,然后只是一个概述(即:创建新发票,使用过滤器缩小显示的发票),并且我不希望用户需要等待发票生成后才能使用其他功能,因此我更改了页面的工作方式

现在,我首先加载基本的html结构,然后才开始使用$.ajax()调用获取发票数据。我构建了一个ajax_加载器来通知用户发生了什么事情。当调用完成时,数据会显示出来,但我仍然有一个问题,即用户不能做任何事情。他可以点击一个链接/按钮或其他任何东西,但在我的ajax调用完成之前,它不会“起作用”。呼叫完成后,一切正常。在有活动调用时单击链接确实会注册“click”事件,但只有在ajax完成时才会触发

这个问题与我的ajax调用是否同步无关。如果有人对如何克服这个问题有任何建议,我将不胜感激。 我的第一个想法是取消ajaxcalls,但从我迄今为止的阅读来看,我怀疑abort()函数无法完成这项工作

编辑: 在进行更多的试用时,我注意到在ajaxcalls仍在运行时,除了从我自己的网站(域、服务器或我应该如何称呼它)加载页面外,其他一切都正常工作 或者执行涉及同一服务器的任何其他ajaxcall i、 e:

因此,我猜测服务器正在忙于构建发票对象,因此它不会接受新请求。 以下是对这一结论的补充:

   console.log("start slow call");  
    slow = $.ajax({  
        a very slow/heavy call  
        success:function(){  
            console.log('end slow call');  
        }  
    });  
    console.log('start fast call');  
    quick = $.ajax({  
        a very quick/lightweight call  
        success: function(){  
            console.log('end fast call');  
        }  
    });  
当我同时进行这两次呼叫时,快速呼叫直到慢速呼叫完成后才会结束:

控制台打印:

start slow call  
start fast call  
end slow call  
end fast call
同时执行这两项操作会使快速呼叫花费5秒钟(根据firebug),而仅执行快速呼叫需要150毫秒

在这之前,我猜想多个AjaxCall将以并行方式而不是串行方式完成

abort() function: (having my 2 ajaxcalls as globals so i can abort them);  

$("a[href]").click(function(){  
    slow.abort();  
    quick.abort();  
    window.location = "index.php";  
    return false;  
})  
使ajaxcalls中止,但服务器仍会继续执行这两个调用中的代码,因此在ajaxcalls中的serversidecode完成之前,它不会接受我转到index.php的请求。
大约5秒钟后(在头部计数),我的index.php将开始加载

因此,我想到以下问题:

是否有任何可管理的方法来取消服务器为该特定客户端运行的所有进程

其他并非根本原因的想法:

我已经调整了invoice构造函数,将布尔值传递给它,以确定对象是否需要所有信息,还是只需要基本信息。这使我的ajaxcall(或者更好的是特定ajaxcall背后的服务器端进程)缩短了约3秒(在1500张虚拟发票上)。我可以调整数据库,因此在已经开发的东西上有很多其他的东西。或者,因为构建所有invoice对象是一个耗时的部分,我可以用非OO的方式来完成吗


这让我有点难过:这是我第一个真正的OOP项目,它很容易处理,但显然在处理大量对象时,在计算时间上有很多麻烦。

嘿,我刚刚对你的问题进行了快速阅读-所以我希望我的答案不会偏离这一点

如果一次调用两个php请求,其中一个不会在另一个之前完成,则快速请求可能无法在慢速请求关闭会话之前启动会话(session_start())


如果不需要,请在启动任何长进程之前再试。

您确定是异步执行AJAX调用,而不是同步执行AJAX调用吗?在异步调用中,您的网页不应该像您描述的那样“冻结”。是的,我100%确定,但我必须指定一些内容。我认为按钮也不会工作,因为“正常”不能。但事实并非如此。点击一个链接不起作用,其他的似乎起作用。我前一段时间在预加载图像时遇到了这个问题。我认为至少有些浏览器不喜欢在当前页面上的所有连接完成之前移动到新页面。你最好的办法可能是将数据分成块,然后检查用户是否希望在每个块之间移动。这解决了我目前遇到的所有问题。非常感谢!你真的救了我一天。格拉茨你赢得了我的第一张选票xD编辑:显然不是因为我需要多一点代表性:)哇;我没有怀疑会话会阻碍我离开页面的能力,但当我接受了你的建议后,调用ajax的页面在我想离开时会立即变得更加响应;没有问题。看似简单,但却是极好的解决方案@butterbrot这可能会对我有所帮助,但我对jQueryAjax还不熟悉,我的代码中也发生了同样的事情,直到第一个ajax调用没有完成,第二个调用没有完成。有没有任何例子可以说明问题的解决方案是什么。我应该在被调用的php函数中调用这个session_write_close()吗?
abort() function: (having my 2 ajaxcalls as globals so i can abort them);  

$("a[href]").click(function(){  
    slow.abort();  
    quick.abort();  
    window.location = "index.php";  
    return false;  
})