【发布时间】: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