【问题标题】:Browser locks during server side expensive process from async request在异步请求的服务器端昂贵的过程中浏览器锁定
【发布时间】:2018-06-06 11:40:19
【问题描述】:

所以我有一个相当昂贵和复杂的 PHP 进程,这使得它的执行时间很长,我们称之为函数“expensive_process()”。

我有一个界面,它通过按下一个按钮调用一个 ajax 请求到一个 PHP 脚本,然后启动“expensive_process()”。这是javascript代码:

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

  var url = "initiate_expensive_process.php";

  $.ajax({
    url: url
  });

});

以及initial_expensive_process.php代码:

<?php
  session_start();    

  run_expensive_process();
?>

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

我检查了网络流量,并且在昂贵的进程()运行时,对initial_expensive_process.php的HTTP请求没有得到响应,但我假设这不应该锁定浏览器,因为它的异步性质请求..

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

有谁知道这可能是什么原因造成的,或者可以做些什么来找出问题的根源?

谢谢

【问题讨论】:

  • 您确定当您关闭浏览器并再次打开它时,您没有从 cookie 中获得另一个 sessionId,因为您在关闭浏览器时将其删除?尝试在启动昂贵的进程()之前记录您的会话 ID,然后在您关闭并打开它时再次记录。
  • 可能是某种会话锁定?你试过 session_write_close();在 run_expensive_process() 之前?
  • @David 那么你没有让它成为多线程的,所以你会卡住直到脚本完成。 BTW 多线程在 php 中不是一个好主意,如果你是第一次接触它
  • 看看stackoverflow.com/q/36029431/2191572,你有足够的CPU核心吗?
  • 您能确认run_expensive_process() 没有重新启用会话吗? run_expensive_process() 是否手动在其他请求所需的内容上放置文件锁?

标签: javascript php ajax apache browser


【解决方案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?

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多