Dojo:所有xhr / ajax调用似乎都是同步的,并阻止了其他调用

Var*_*rin 5 javascript php ajax dojo

我正在研究继承的CRM。长话短说-有一个按钮可以调用php脚本,该脚本应在后台运行,我们不需要等待响应。

request(idata+'transferInTimeExec.php',{
    sync: false,
    preventCache:true,
    method:'GET'
});
Run Code Online (Sandbox Code Playgroud)

现在,transferInTimeExec.php运行需要一个小时,这是一个非常复杂的脚本,它处理招聘公司的每周时间表,对其进行处理,执行大量数据库操作等。

使用Chrome。每当我按下按钮运行它时,它将阻止所有xhr调用,直到完成为止。CRM处于“ ajax繁重”状态,并且在脚本运行时,用户无法执行任何操作,如果他们导航到另一个子页面,则直到我们开始的过程完成之前,xhr请求都不会得到解决。即使当我打开一个新的浏览器选项卡并尝试执行某些操作时,它也不会执行此操作。如果在脚本运行时在另一个浏览器(Firefox)中打开CRM,则可以使用CRM。

在“网络”选项卡中-第一个未决,您可以看到所有对不同Ajax呼叫等待的后续调用(都具有sync:false)

在此处输入图片说明

我什sleep(30)至用PHP函数替换了整个逻辑,以使其在返回任何内容之前30秒钟什么都不做-同样的问题。

onClick在按钮HTML标记内的普通javascript中尝试了XHR ,而不是Dojo方法-同样的问题。

我对整个项目进行了残酷的搜索/替换,替换sync:truesync:false-没有任何更改。

我的想法已经用完了,也许这里有人可以帮忙解决这个问题?是否有用于同步/异步的全局开关?如果不是ajax问题,那还会是什么?

asc*_*ftw 3

您的脚本transferInTimeExec.php可能正在使用会话。在这种情况下,其他 AJAX 调用将不会启动,而是等待此 AJAX 调用完成,以免覆盖会话数据。将 AJAX 调用设置为异步不会改变行为。

如果此脚本需要 1 小时才能运行,那么从 UI 将其作为 AJAX 调用是个坏主意。您应该每小时或每天设置一个 Cron,并在后端执行所有操作。当然,如果使用session,则需要对脚本进行一些调整。

编辑

session_write_close();您可以在脚本的顶部使用。这告诉 PHP 该脚本不会向会话写入任何内容,因此其他 AJAX 调用可以自由使用该会话。但是请注意,在此之后不要向会话写入任何内容,因为这会导致错误。