1

这个问题与我之前提出的问题有关,请参见此处

作为实现分段 ajax 响应的一种方式,我创建了一个执行此操作的代码:

客户端首先调用初始化进程的脚本。在服务器端,startScript.cgi 代码开始生成数据,并在此过程中将响应分组为块,并将它们写入按顺序索引的单个文件(chunk1.txt、chunk2.txt 等)。在 startScript.cgi 启动此过程后,客户端立即开始第二个 ajax 请求,发送到gatherOutput.cgi,参数为?index=0。

collectOutput.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、system 或反引号),它会一直运行,并且无法进行分段。

4

1 回答 1

2

当文件不存在时,您的 gatherOutput.cgi 不应陷入循环。而是向您的 AJAX 请求返回文件尚不存在的状态,然后让它等待(使用 setInterval 或 setTimeout)并在这么多秒后重试。

这在您的服务器上会容易得多。对于用户,您仍然可以显示加载图形或其他内容,让他们知道该过程仍在后台进行。

于 2010-08-03T16:49:47.757 回答