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


AJAX call to check status of running process in the background, timing out

我一直在寻找这个问题的答案,但没有找到一个,希望有人能给我指出正确的方向,我想我已经接近了

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

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

问题是AJAX请求在scraper的第4步之后超时(浏览器默认超时是115/120秒),即使它不应该,因为我正在使用两个不同的主机…也就是说,好像我同时阻塞了host1。mydomain.com上的两个连接因为我从host2

启动了scraper

iframe加载这个URL: http://host2.mydomain.com/page.phpPHP脚本的内容调用:

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

的状态

,一旦scraper进入第4步,我的ajax请求就超时了

我想我把自己弄糊涂了,但希望有人能帮助我

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

如果你遇到同样的问题,希望其他人能发现这有用

干杯!杰夫

与其等待请求完成,不如在服务器的后台生成运行的新进程。并使用javascript每隔几秒钟"检查"一次,看看执行何时完成。然后,您所要做的就是选择结果并显示它。

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