AJAX调用在后台检查运行进程的状态,超时

时间:2011-10-07 19:18:53

标签: php ajax exec background-process

我已经全神贯注地找到了关于此的任何答案而未能找到一个,希望有人可以指出我正确的方向,我想我很接近

我有两个主机让我们称之为host1.mydomain.com和host2.mydomain.com(为了解决每个主机/每个浏览器问题的2个并发连接),所以他们都指向相同的内容一个只是一个别名另一个

用户访问host1.mydomain.com,输入一些信息进行注册,单击Go,在同一页面上加载iframe,指向host2.mydomain.com上的页面,该页面通过exec调用php脚本(“curl” )将请求发送到后台以启动网站刮刀,然后将进程ID存储在用户的数据库中。 iframe成功加载后(因为它创建后台进程只需要1秒)我在一段时间内设置了一个AJAX请求,以定期检查cURL进程的状态(通过它在数据库中的进程ID),这样我就可以显示刮刀的当前步骤(总共有6个步骤)。到目前为止一切都很好。

问题是AJAX请求在刮刀的第4步之后超时(浏览器默认超时为115/120秒),即使它不应该是因为我正在使用两个不同的主机...意思是说我几乎没有在host1.mydomain.com上堵塞两个连接,因为我不是因为我从host2发起了刮刀

iframe加载此网址:http://host2.mydomain.com/page.php PHP脚本的内容调用:

exec("curl -o /dev/null 'http://host2.mydomain.com/page.php?method=process' > /dev/null & echo $!", $op);

然后我的ajax请求轮询http://host1.mydomain.com/status.php?pid=x,它在数据库中查找以通过进程ID检查状态

一旦刮刀进入第4步,我的ajax请求就会超时

我觉得我很困惑自己解释这个,但希望有人可以帮助我

2 个答案:

答案 0 :(得分:3)

原来我成功地绕过每个服务器/浏览器限制的2个连接...但是在做一些研究时我发现我的ajax请求挂起的原因是因为我试图访问并写入来自的会话数据两个请求。深入挖掘我发现一个session_write_close()关闭会话进行读/写,我基本上必须在刮刀的每个页面请求之后调用它然后重新初始化会话,这允许我的ajax请求通过并停止阻塞请求。

如果您遇到同样的问题,希望其他人认为这很有用

干杯! 杰夫

答案 1 :(得分:1)

您应该spawn new process在服务器后台运行,而不是等待请求完成。并使用javascript每秒几次“检查”以查看执行何时完成。然后你所要做的就是拿起结果并显示出来。

此外,您可能希望确保只生成一个php进程。