【问题标题】:Getting big amount of data from a very slow external data-source从非常慢的外部数据源获取大量数据
【发布时间】:2012-04-28 01:34:45
【问题描述】:

我需要从外部来源接收大量数据。问题是外部源发送数据非常慢。工作流程是这样的:

  1. 用户从应用程序界面启动一些进程(通常是从本地 xml 文件中获取数据)。这是一个相当快的过程。
  2. 之后,我们需要加载与从外部来源获取的数据相关的信息(基本上是来自 xml 的数据的外部统计信息)。而且速度很慢。但用户需要此附加信息才能继续工作。例如,他可以根据外部数据或其他东西进行过滤。

所以,我们需要异步进行。主要思想是在外部数据可用时显示它。问题是我们如何组织这个异步过程?也许是一些问题或其他什么?我们使用 php+mysql 作为后端,使用 jquery 作为前端。 非常感谢!

【问题讨论】:

  • 有没有办法使用网络服务
  • 缓存数据对第 2 部分有帮助吗?
  • 请说明——您将获取的数据存储在数据库中还是用于实时显示?你如何从外部来源获取数据?你用 cURL 还是类似的?
  • Maxim,一般来说,您希望在一组端点后面抽象出繁重的操作,这些端点允许您启动作业,然后查询它以完成和获取新数据。这可能就是 @COLDTOLD 所指的 Web 服务。一个示例是两个脚本,begin_statistics.php 和 statistics_status.php。您可以将 XML 发布到 begin_statistics,这将启动对外部服务的异步调用、存储会话令牌并返回作业编号,并且 statistics_status 可以接收该作业编号,然后回复最近的数据。使用 JavaScript 中的轮询循环,您就有了基本的解决方案。
  • 另外你可能想考虑websockets,你连接到服务器并开始输出数据,输出数据立即通过套接字发送到客户端,js在客户端输出。但是它只能在现代浏览器上运行,并且您必须准备好服务器端技术,因此最好是 apache 的附加模块。

标签: php javascript jquery asynchronous queue


【解决方案1】:

您的两种可能的策略是:

  1. 在后端进行流式处理,使用 PHP 脚本将大型外部资源卷曲到数据库或内存缓存中,并通过刷新该 db 行或缓存到响应中。

  2. 在前端进行流式传输,使用this answer 中解释的跨浏览器 JavaScript 技术。在 Gecko 和 WebKit 中,每次接收到新数据时都会触发 XmlHttpRequest.onreadystatechange 事件,从而可以将数据缓慢地流式传输到 JavaScript 运行时。在 IE 中,您需要使用 iframe 解决方法,在上述 SO 帖子中链接的 Ajax Patterns article 中也进行了说明。

【讨论】:

  • 我们倾向于使用两个 php 脚本和来自前端的长轮询请求的“经典”变体。 (您的第一个变体)。非常感谢!
【解决方案2】:

一种可能的解决方案是使用system() 进行cURL 调用,并将输出重定向到一个文件中。因此 PHP 在调用完成之前不会挂起。来自system() 的 PHP 手册:

如果使用此函数启动程序,为了使其继续在后台运行,必须将程序的输出重定向到文件或另一个输出流。否则会导致 PHP 挂起,直到程序执行结束。

这将拆分从用户界面收集的数据。然后,您可以通过多种方式处理收集到的本地数据,例如:

  • 在 GUI 中使用 iFrame,它会在一定间隔内刷新自身并从本地存储的文件中获取数据(并可能将其存储在数据库中或其他任何地方),
  • 使用 jQuery 进行 AJAX 调用以获取数据并对其进行操作,
  • 使用一些可以在后台运行并处理数据库写入的 CGI 脚本,并直接使用数据库中的上述任一方法显示数据,
  • 还有几十个我现在想不出来...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2016-04-04
    • 2011-11-08
    • 2013-12-20
    相关资源
    最近更新 更多