jQuery Ajax快速连续中止和新请求

时间:2012-10-12 13:18:51

标签: apache jquery jquery-mobile

我有一个移动应用,它可以制作

JqXHR = $.ajax({
    url: 'url',
    data: null,
    async: true,
    cache: false,
    dataType: 'json',
    type: 'GET',
    crossDomain: true,
    timeout: 63000,
    success: function(data, textStatus, jqXHR) {},
    error: function(jqXHR, textStatus, errorThrown) {}
});

请求。它等待63秒(PHP后端CAN运行约62秒),以便在另一端进行用户交互。现在,如果同时我决定中止这个请求,那么我打电话给JqXHR.abort()。在错误处理程序中,我已经处理/区分真正的错误和中止,这是有效的。在中止之后,我想向服务器发送另一个API调用来绑定松散的端点,并确保记录我的取消请求。

还有问题。即使我abort()第一个请求,PHP脚本仍然在服务器上运行,如果它还执行了第二个请求,这将使它停止并死亡(),这不会有问题。但它没有发生。第二次请求直到第一次完成才会发生。

有什么想法吗?

jQuery 1.8.2,jQuery Mobile 1.2.0,PhoneGap 2.0.0和2.1.0,Apache 2,Linux,PHP 5.3

3 个答案:

答案 0 :(得分:3)

一些信息:Parallel-Ajax vs Apache-Session locking


会话数据通常 脚本终止后存储,但会话数据被锁定以防止并发写入 > 任何时候只有一个脚本可以在会话上运行

例如使用框架集和会话,您将体验到由于此锁定而逐个加载的框架。 您可以通过尽快结束会话来缩短加载所有框架所需的时间


因此您可以在ajax脚本中使用会话 session_start();(可能会自动处理)session_write_close();

立即(尽快)

session_write_close();将“结束”当前会话并存储会话数据。

但是: session_id()仍会提供正确的(当前)PHPSESSID,因此您只需再次执行session_start()即可重新获得对当前会话的写入权限任何时候你需要它。


我在所有的ajax脚本中以这种方式使用它来实现会话处理允许并行请求

答案 1 :(得分:1)

似乎我遇到了旧的PHP会话与AJAX请求问题。实际上我的老板通过谷歌搜索我从未想过的一些表达来发现这个问题。我在后端使用Zend框架,它会自动启动会话命名空间,因此在我的API控制器的preDispatch()方法中,我必须放入@session_write_close();就像魔术一样,它就像一个魅力。

感谢Arun的快速回复,这是最受欢迎的。

因此,简而言之:如果您使用Zend Framework或session_autostart或其他启动会话的方式,它们将无法使用并行的AJAX请求。

答案 2 :(得分:0)

abort方法不会终止服务器进程,只会终止客户端等待服务器响应。

就第二个请求而言,您能分享第二个请求的发送方式吗?