向网页提供动态数据

时间:2010-04-09 11:10:26

标签: php

我有一个网页,显示每2秒更改一次的动态数据。从包括Oracle在内的各种数据源中选择数据。目前,页面每10秒重新加载一次并运行一个PHP脚本,该脚本检索数据并显示页面。我有其他页面,可以对相同的数据提供不同的视图。这意味着它们也会再次运行相同的查询。如果我有4个这样的页面,每个10个并发用户,突然数据检索每10秒发生40次,显然不理想。我对如何改善这种情况有一些想法,但我想我会从其他专家的一些想法中提出可能遇到类似情况的想法。我没有绑定PHP,我的服务器在Linux平台上。

此致

的Marius

6 个答案:

答案 0 :(得分:0)

在memcache中缓存检索到的数据几秒钟。

答案 1 :(得分:0)

除了改进您的数据结构和查询方法之外,您还需要开始查看所有不同级别的缓存。

答案 2 :(得分:0)

假设您不想运行cron作业以使一个本地副本保持最新24x7 ....

在本地存储数据及其获取时间。如果在收到请求时,数据被认为是陈旧的,则在获取数据之前引发互斥锁 - 这也意味着脚本应该在尝试刷新缓存之前检查互斥锁。

请注意,PHP没有复杂的文件锁定语义 - 所以我建议将本地数据存储在数据库中。请注意,AFAIK在PHP中没有非阻塞锁机制,也没有提供超时的机制 - 所以你可能需要自己动手。

下进行。

答案 3 :(得分:0)

根据您的要求,我建议您使用彗星服务器。

检查此主题是否有详细信息solution for COMET and PHP

您可以通过以下链接查看几个示例

APE Project

Lightstreamer

Liberator

答案 4 :(得分:0)

我的其他答案 -

您可以通过以下方式避免互斥问题:

有一个用于检查控制文件上的mtime的cron脚本 - 如果它已在N分钟内更新,则将集合运行到本地副本。

在网页脚本中,如果本地数据过时,则返回一条消息,说明其刷新数据,更新控制文件。如果本地数据不是陈旧的,请显示它并更新控制文件。

下进行。

答案 5 :(得分:0)

我在最近的一个项目中遇到了类似的问题,并选择使用Memcached守护程序缓存所有检索到的数据库数据。因此,不是查询数据库40次,而是查询一次,然后只需打开与memcached守护程序的TCP / IP连接即可获取缓存的结果数据。请注意,PHP有一个memcached扩展,很容易理解和使用。

如果您向用户显示的页面必须每2秒左右更新一次数据,那么最好通过AJAX重新加载数据,而不是每次刷新页面时都加载HTML,CSS和Javascript。上面提到的Taha使用Comet服务器来模拟将数据从服务器“推送”到客户端。你可以轻松自己动手。根据我的理解,适用于所有主流浏览器的两种主要技术是:

  • AJAX长轮询,只有在新数据可用时才会完成AJAX请求(这是我最终使用的方法)。
  • 在IFRAME中加载永无止境的页面。

可以使用上述两种技术的优秀教程here。作者还提供了下载代码。

虽然我使用Apache + PHP来实现我的Comet解决方案,但最好切换到非阻塞框架,例如Tornado (Python)