gpt4 book ai didi

php - 如何打破挂起的ajax调用并加载另一个页面

转载 作者:可可西里 更新时间:2023-10-31 22:59:05 25 4
gpt4 key购买 nike

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

现在我正在一个页面上进行概述。发生的问题是,当我有太多发票(仅使用 1500 张虚拟发票进行测试,时间可能会更多)时,php 对象的构建需要大约 7 秒。我觉得这太长了,因为这仅适用于一个请求。此外,由于 php 在服务器端运行,因此在对象全部构建之前页面没有加载任何内容。
我盯着一个空屏幕 7 秒钟,然后立即获得了所有内容(全部在 localhost 上,因此在线情况应该更糟)。

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

现在我首先加载我的基本 html 结构,然后才开始使用 $.ajax() 调用获取我的发票数据。我构建了一个 ajax_loader 来通知用户正在发生的事情。调用完成后会显示数据,但我仍然遇到用户无法执行任何操作的问题。他可以单击链接/按钮或其他任何东西,但在我的 ajax 调用完成之前它不会“采取行动”。调用完成后,一切正常。在有事件调用时单击链接确实会注册 'click' 事件,但触发器仅在 ajax 完成时发生。

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

编辑:
做了更多的尝试,我注意到在 ajaxcalls 仍在运行时一切正常,除了从我自己的网站(域、服务器或我应该称之为)加载一个页面
或执行任何其他涉及同一服务器的 ajaxcall
IE:

$("#dummyButton").click(function(){  
window.location='http://www.google.com' //works
window.location='index.php' //doesn't work
alert("test"); //works
console.log("test"); //works
})

a href='http://www.google.com' //works
a href='index.php' //doesnt work

所以我的猜测是服务器正忙于构建我的发票对象,因此它不会接受新请求。
以下补充了这个结论:
   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 的服务器端代码完成之前,它不会接受我转到 index.php 的请求。
大约 5 秒后(在头部计数)我的 index.php 将开始加载

因此想到了以下问题:

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

其他没有成为根本原因的想法:

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

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

最佳答案

嘿,我刚刚对您的问题进行了非常快速的阅读 - 所以我很高兴我的答案不会离开这里。

当您一次调用两个 php 请求并且一个不会在另一个之前完成时,那么在慢速请求关闭它之前,快速请求有可能无法启动 session (session_start())。

试试 closing the session如果在开始任何漫长的过程之前不再需要。

关于php - 如何打破挂起的ajax调用并加载另一个页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5272070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com