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

Php 如何最好地处理需要很长时间才能完成的ajax请求?,php,ajax,node.js,Php,Ajax,Node.js,在回答这个问题之前,让我先说一下,我对设计处理器密集型web应用程序的体系结构还比较陌生。我已经在一个LAMP堆栈上构建了一个功能性应用程序,现在正处于开发阶段,我必须实现它的规模 我有一个运行PHP代码的web服务器,ssh进入远程Windows机器以执行批处理过程,根据并发性,完成批处理过程可能需要15到45秒。我正在使用由提供的SSH2实现登录到远程机器以启动批处理文件。PHP代码如下所示: $remoteCommand = 'psexec -u username -p password

在回答这个问题之前,让我先说一下,我对设计处理器密集型web应用程序的体系结构还比较陌生。我已经在一个LAMP堆栈上构建了一个功能性应用程序,现在正处于开发阶段,我必须实现它的规模

我有一个运行PHP代码的web服务器,ssh进入远程Windows机器以执行批处理过程,根据并发性,完成批处理过程可能需要15到45秒。我正在使用由提供的SSH2实现登录到远程机器以启动批处理文件。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机器上的automation_process.bat。但是,automatic_process.bat文件需要一段时间才能执行,如果有并发用户,有时会导致web服务器的PHP超时。在php.ini中增加max_execution_time值并不能解决这个问题

使用PsExec时,
-d
开关将不会等待automation_process.bat完成,并将允许PHP脚本在不等待的情况下继续。所以,问题在max_execution_时间前端解决了,但另一个问题出现了:通知最终用户的浏览器自动_过程已经完成。如何有效地做到这一点?似乎需要的是应用程序代码中的体系结构更改

起初,我认为某种投票会起作用——也许是长时间的投票?我只需要ping远程windows机器,看看这个过程是否完成。但是我读到的每一篇文章都说,长时间轮询对Apache来说是一个沉重的负担,而远程Windows机器正在运行Apache。此外,在web上大量的文字都指向Node.js作为解决方案。这真的是解决这类问题的办法吗?我是否必须学习一个新的框架,以便随着应用程序的扩展使此操作变得健壮?我对此很满意,但我想知道我是否可以混合使用PHP和Node.js。如果是这样的话,谁能给我举个简单的例子让我开始学习呢


谢谢

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


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

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

远程机器的Automatic_process.bat不会将数据转储到一个静态文件中。它创建了几个特定于登录用户的文件。我不认为一个老太婆是答案。我不确定我是否理解你所说的“增加AJAX调用的超时”是什么意思,而我真正想要的是尽可能减少获取数据所需的时间。我所说的转储到文件的意思是,你可以有一个PHP文件定期ping远程机,如上文所示,然后将数据保存到静态文件中,以便以后检索。但是,由于大多数调用都是不同的,所以这不是一个好的解决方案。至于增加ajax调用的超时,这只会防止它在服务器发回数据之前关闭连接并出错。这与长轮询基本相同,但不会中断连接。大量并发连接可能会出现问题,这取决于您的设置。但是多个Ajax请求对apache来说不是一个问题吗?你的解决方案听起来像是轮询,我的问题是,像Node.js或Websocket.IO这样的框架,甚至Comet,从执行繁重处理的远程机器获取更新是否有意义。我对apache问题的理解是,apache不喜欢开放式请求。我提议的结构消除了保持开放的请求。作为初始请求的一部分设置websocket将是对我提出的解决方案的一个巨大改进。除非您知道您的所有客户端都支持websocket,否则我会按照我最初的建议进行设置,因为您将不得不将非websocket客户端降级为它…我可能错了,但我认为socket.io可以处理非websocket客户端。我决定学习如何将socket.io与node.js结合使用。