此问题与我之前提到的问题有关,请参阅here。
作为实现分段ajax响应的一种方法,我创建了一个执行此操作的代码:
客户端首先调用初始化进程的脚本。在服务器端,startScript.cgi代码开始生成数据,并且当它执行此操作时,它将响应分组为块,并将它们写入按顺序索引的单个文件(chunk1.txt chunk2.txt等)。在startScript.cgi启动此过程之后,客户端立即开始第二个ajax请求,发送到gatherOutput.cgi,参数?index = 0。
gatherOutput.cgi查看请求,然后查看'chunk'。$ index。'。txt'然后返回数据。客户端将此输出到html,然后使用参数?index = 1等开始第二个ajax请求到gatherOutput.cgi。这将持续到报告来自startScript.cgi的所有数据。
如果gatherOutput.cgi找不到“chunk $ index.txt”,它会进入这个循环:
until(-e "$directory/chunk$index.txt")
{
#nothing
}
open $fh, "<$directory/chunk$index.txt" || warn "File not found. blah blah";
#Read file and print, etc...
请注意,startScript.cgi运行的代码可能需要很长时间才能完成,所以关键是要同时广播startScript.cgi中的旧输出,因为它会生成新的输出。
这样做的问题在于性能会受到影响,尽管很久以前创建了输出,但输出还需要一段时间。我假设这是因为与startScript.cgi中的CPU操作相比,硬盘访问速度非常慢,所以gatherOutput.cgi经常等待要写入的新块,或者客户端经常等待gatherOutput.cgi读取文件等。虽然可能还有其他问题。
有没有人有任何想法或建议来解决这个问题?或者,如果有人对这个问题采取不同的方法,那也很好。
顺便说一句,startScript.cgi可能只被调用一次,它启动一个大型任务系统任务(系统转义,如exec,系统或反引号),它继续运行,并且无法进行分段。
答案 0 :(得分:2)
当文件不存在时,您的gatherOutput.cgi不应该进入循环。而是将状态返回到您的AJAX请求,该文件尚不存在,然后让它等待(使用setInterval或setTimeout)并在这么多秒后再试一次。
在您的服务器上这将更容易。对于用户,您仍然可以显示加载图形或其他内容,让他们知道该过程仍在后台进行。