浏览器在异步请求

时间:2018-06-06 11:40:20

标签: javascript php ajax apache browser

所以我有一个相当昂贵和复杂的PHP过程,它使得它的执行持久,让我们称之为函数" expensive_process()"。

我有一个界面,通过按一个按钮调用一个PHP脚本的ajax请求,该脚本反过来启动" expensive_process()"。这是javascript代码:

$('#run_expensive_process_button').click( function(){

  var url = "initiate_expensive_process.php";

  $.ajax({
    url: url
  });

});

并且initiate_expensive_process.php代码:

<?php
  session_start();    

  run_expensive_process();
?>

简单而琐碎。现在问题在于,虽然expensive_process()正在运行,但浏览器正在失去导航域的能力。如果我刷新浏览器窗口,它会在进程持续时无限期挂起。如果我重定向到同一域下的不同URL,同样的事情。这种情况发生在所有浏览器但是,如果我重新启动浏览器(关闭并打开一个新窗口,而不是选项卡),导航工作正常,即使expensive_process()仍在运行。

我已经检查了网络流量,并且对expert_expensive_process.php的HTTP请求在运行expensive_process()时没有得到响应,但是我假设这不应该是锁定的浏览器给出了请求的异步性质。

还有一件事我认为是相关的。这种情况发生在副本服务器上。在我运行WAMP和相同源代码的本地计算机上,这没有发生,即,当expensive_process()正在运行时,我仍然可以在不必重新启动浏览器的情况下导航托管域。这似乎表明某种服务器配置问题,但我不确定是否可以排除其他可能的原因。

任何人都知道可能导致此问题的原因或可以采取哪些措施来找出问题的根源?

由于

2 个答案:

答案 0 :(得分:1)

其他PHP脚本很可能也是会话变量。一次只能有一个脚本进程访问会话;如果第二个脚本在第一个脚本仍在运行时尝试访问会话,它将被阻止,直到第一个脚本完成。

第一个脚本可以在使用会话完成后调用session_write_close()来解锁会话。有关如何构建脚本的详细信息,请参阅If call PHP page via ajax that takes a while to run/return (and it sets session variables), will a 2nd ajax call see those session changes?

答案 1 :(得分:-1)

我想知道是否可能是因为ajax。 javascript正在客户端执行。 也许您可能会考虑使用字符串化的JSON调用而不是ajax?