如何最好地处理需要很长时间才能完成的ajax请求?

时间:2012-03-02 21:44:52

标签: php ajax node.js

让我先说这个问题,说我对构建处理器密集型Web应用程序的设计相对较新。我有一个基于LAMP堆栈的功能应用程序,现在我正处于开发阶段,我必须实现扩展。

我有一个运行PHP代码的Web服务器ssh进入远程Windows机器以执行批处理过程,根据并发性可能需要大约15到45秒才能完成。我正在使用phpseclib pear library package提供的SSH2实现登录到远程计算机以使用Sysinternals' PsExec启动批处理文件。 PHP代码看起来像这样:

$remoteCommand = 'psexec -u username -p password -h cmd /C "C:\\automate_process.bat >> automate_process.log 2>>&1"';
$ssh_connection->exec($remoteCommand);

这实际上是从托管php代码的Web服务器调用远程Windows机器上的automate_process.bat。但是,automate_process.bat文件需要一段时间才能执行,如果有并发用户,有时会导致Web服务器的PHP超时。增加php.ini中的max_execution_time值并不能解决问题。

使用PsExec,-d开关不会等待automate_process.bat完成,并且将允许PHP脚本继续而无需等待。因此,在max_execution_time前面解决了问题,但出现了另一个问题:通知最终用户的浏览器automatic_process已完成。如何以有效的方式完成?看似需要的是应用程序代码中的体系结构更改。

起初我认为某种民意调查会起作用 - 也许是长期民意调查?我只想ping远程Windows机器以查看进程是否完整。但我读到的所有内容都表明,长轮询是Apache的一个严重负担,而远程Windows机器正在运行。此外,Web上的大量写作都指向Node.js作为解决方案。这真的是解决这类问题的方法吗?我是否必须学习一个新的框架,以便在应用程序扩展时使此操作更加强大?我很好,但我想知道我是否可以混合使用PHP和Node.js。如果是这样,有人可以提供一个简单的例子让我开始吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

由于这是一个AJAX请求,一个简单(但不一定理想)的选项是在PsExec上省略-d开关,以便脚本等待它完成,在PHP中调用该脚本的max_execution_time,并增加AJAX调用超时。这样浏览器只会保持该连接打开,直到获得输出。这是否是一个好的解决方案取决于很多因素。

如果所有这些AJAX请求都请求相同的数据(或者只有少数不同的请求),并且数据不必是最新的,那么您可以定期创建一个cron作业在服务器上运行该进程并将输出存储到文件中(可能每5分钟一次),然后您的ajax调用可能只是请求该静态文件。如果文件中的信息是敏感的,您自然需要添加一层安全性。

答案 1 :(得分:1)

如果处理时间是这样的话,我会设置客户端以初始ajax请求启动处理。服务器将启动该过程并回复“处理”。可以在客户端的ajax请求之间延迟10秒重复该循环,直到该过程完成,您只需要跟踪服务器上的每个客户端......