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

让我先说这个问题,说我对构build处理器密集型Web应用程序比较陌生。 我有一个build立在LAMP堆栈上的function性应用程序,现在正处于开发阶段,我必须实现规模化。

我有一个运行PHP代码的web服务器,ssh进入一个远程的Windows机器执行一个批处理过程,根据并发性,完成大约需要15到45秒。 我使用phpseclib pear库包提供的SSH2实现来login到远程机器,用Sysinternals的PsExec启动batch file。 PHP代码看起来像这样:

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

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

使用PsExec时, -d开关不会等待automate_process.bat完成,并且将允许PHP脚本继续而不用等待。 所以,在max_execution_time方面解决了问题,但另一个问题出现了:通知最终用户的浏览器自动化进程已经完成。 这怎么能有效地完成呢? 看起来需要的是应用程序代码中的体系结构更改。

起初,我认为某种投票可以做到这一点 – 也许是长期投票? 我只是ping远程的Windows机器,看看过程是否完成。 但是我读到的所有内容都表明,长轮询是远程Windows机器运行的Apache的一个沉重负担。 另外,网上的大量文章指出Node.js是一个解决scheme。 这真的是解决这类问题的方法吗? 我是否必须学习一个新的框架来使这个操作在应用程序扩展时稳健? 我很好,但我想知道如果我可以混合n匹配的PHP和Node.js。 如果是这样,任何人都可以提供一个简单的例子,让我开始?

谢谢!

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

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

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