代码之家  ›  专栏  ›  技术社区  ›  Gavin Gilmour

使用Ajax处理长服务器端操作?

  •  4
  • Gavin Gilmour  · 技术社区  · 16 年前

    我有一个 尤其 当 用户在界面上按下一个按钮,我想知道什么是最好的 向客户机表明这一点的方法。

    该操作正在为若干年的数据填充事实表。 这大约需要20分钟,所以我不希望界面 同步的。尽管它正在生成大量的数据服务器端, 我仍然希望所有事情都能保持响应,因为这个月的数据 用户当前正在查看的内容将很快更新,这不是问题。

    我想在操作完成后设置会话变量。 以及该会话变量的轮询。这样做是可行的吗? 事情?不过,我特别担心 关于用户离开/关闭浏览器,然后关闭所有状态 关于长期运行的工作丢失了。

    当处理记录开始和结束时,最好在某个地方插入一个记录来存放它。然后创建其他类型的界面,以便用户(或用户)可以监视当前正在执行/完成/失败的作业?

    我有什么可以看的资源吗?

    你是怎么做到的?

    5 回复  |  直到 16 年前
        1
  •  5
  •   Spencer Ruport    16 年前

    代码的服务器端部分应该产生或与Web服务器外部的进程通信。使用网页代码来运行应该由守护进程处理的任务只是草率的工作。

        2
  •  2
  •   Draemon    16 年前

    你不能指望他们在这里呆20分钟。即使是世界上最合作的用户也一定会离开,做些别的事情,忘记,然后关闭窗口。允许如此长的连接时间会使任何合理的HTTP超时的机会变得更糟,也会使您对琐碎的DOS敞开心扉。

    正如Spencer建议的那样,使用第一个请求来启动一个独立于HTTP请求的进程,在Ajax响应中返回一个ID,在会话中或在数据库中存储该ID,或者您想要的任何内容。然后,用户可以做他们想做的任何事情,并且不会中断任务。ID可用于轮询状态。如果将其保存到数据库,用户可以注销、清除其cookie,当他们重新登录时,您仍可以检索任务的状态。

        3
  •  0
  •   Mike Chaliy    16 年前

    会话是不可实现的,我可能会设计一些任务列表。所以我可以为每个用户保留任务记录。通过这种设计,我将能够显示“完成”的任务,以保持用户的意识。

    另外,我将把长时间的操作移出工作进程。这是必需的,因为Web服务器可以被重新限制。

    而且,是的,我将每隔几十秒从使用Ajax调用的服务器请求一次状态。

        4
  •  0
  •   Bostone    16 年前

    您可以使用JS计时器定期对服务器执行ping操作,以查看是否完成了任何作业。如果用户离开并返回,则重新启动计时器。当作业完成后,您会向用户指出这一点,以便他们可以单击链接并打开报告(我不建议强制加载某些内容,尽管可以这样做)。

        5
  •  0
  •   OmerGertel    16 年前

    根据我的经验,最好的方法是在服务器端保存每个用户正在运行的报表及其状态。然后客户端将定期轮询此状态。 基本上,不是让客户机询问checkstatusof(int session),而是让客户机询问getrunningjobsfor(int userid)的服务器返回所有正在运行的作业和状态。