【问题标题】:Further question on segmenting AJAX responses关于分割 AJAX 响应的进一步问题
【发布时间】:2011-03-24 20:15:32
【问题描述】:

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

【问题讨论】:

    标签: ajax perl apache cgi long-polling


    【解决方案1】:

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

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

    【讨论】:

    • 好主意,我会实现它,看看它对性能的提升有多大。谢谢!任何进一步的建议仍然很感激。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2011-03-21
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多