这个问题与我之前提出的问题有关,请参见此处。
作为实现分段 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 或反引号),它会一直运行,并且无法进行分段。