7

我有一个移动应用程序,它使

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 后端可以运行约 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

4

3 回答 3

3

一些信息:Parallel-Ajax 与 Apache-Session 锁定


会话数据通常在脚本终止后存储,但由于会话数据被锁定以防止并发写入,任何时候只有一个脚本可以对会话进行操作

例如,当将框架集与会话一起使用时,由于这种锁定,您将体验到一个一个加载的框架。您可以通过尽快结束会话来减少加载所有帧所需的时间。


因此,您可以在 ajax 脚本中使用会话 session_start();(可能会自动处理),然后立即(尽快)session_write_close();

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

但是: session_id()仍然会提供正确的(当前)PHPSESSID,因此您可以session_start()在需要时随时再次执行,从而重新获得对当前会话的写访问权限。


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

于 2013-01-29T12:54:28.990 回答
1

It seems I ran into the good old PHP sessions vs. AJAX requests issue. Actually my boss found out about this issue by googling some expressions i never thought of. I am using Zend framework in the back-end, and it automatically starts a session namespace, so in my API controller's preDispatch() method I had to put in a @session_write_close(); line, and as if by magic, it works like a charm.

Thanks Arun for your quick reply, it is most appretiated.

So, in short: If you use Zend Framework or session_autostart or other means of starting sessions, they won't fly with parallel AJAX requests.

于 2012-10-12T14:49:02.100 回答
0

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

于 2012-10-12T13:27:07.907 回答