我有一个网页,显示每2秒更改一次的动态数据。从包括Oracle在内的各种数据源中选择数据。目前,页面每10秒重新加载一次并运行一个PHP脚本,该脚本检索数据并显示页面。我有其他页面,可以对相同的数据提供不同的视图。这意味着它们也会再次运行相同的查询。如果我有4个这样的页面,每个10个并发用户,突然数据检索每10秒发生40次,显然不理想。我对如何改善这种情况有一些想法,但我想我会从其他专家的一些想法中提出可能遇到类似情况的想法。我没有绑定PHP,我的服务器在Linux平台上。
此致
的Marius
答案 0 :(得分:0)
在memcache中缓存检索到的数据几秒钟。
答案 1 :(得分:0)
除了改进您的数据结构和查询方法之外,您还需要开始查看所有不同级别的缓存。
答案 2 :(得分:0)
假设您不想运行cron作业以使一个本地副本保持最新24x7 ....
在本地存储数据及其获取时间。如果在收到请求时,数据被认为是陈旧的,则在获取数据之前引发互斥锁 - 这也意味着脚本应该在尝试刷新缓存之前检查互斥锁。
请注意,PHP没有复杂的文件锁定语义 - 所以我建议将本地数据存储在数据库中。请注意,AFAIK在PHP中没有非阻塞锁机制,也没有提供超时的机制 - 所以你可能需要自己动手。
下进行。
答案 3 :(得分:0)
答案 4 :(得分:0)
我的其他答案 -
您可以通过以下方式避免互斥问题:
有一个用于检查控制文件上的mtime的cron脚本 - 如果它已在N分钟内更新,则将集合运行到本地副本。
在网页脚本中,如果本地数据过时,则返回一条消息,说明其刷新数据,更新控制文件。如果本地数据不是陈旧的,请显示它并更新控制文件。
下进行。
答案 5 :(得分:0)
我在最近的一个项目中遇到了类似的问题,并选择使用Memcached守护程序缓存所有检索到的数据库数据。因此,不是查询数据库40次,而是查询一次,然后只需打开与memcached守护程序的TCP / IP连接即可获取缓存的结果数据。请注意,PHP有一个memcached扩展,很容易理解和使用。
如果您向用户显示的页面必须每2秒左右更新一次数据,那么最好通过AJAX重新加载数据,而不是每次刷新页面时都加载HTML,CSS和Javascript。上面提到的Taha使用Comet服务器来模拟将数据从服务器“推送”到客户端。你可以轻松自己动手。根据我的理解,适用于所有主流浏览器的两种主要技术是:
可以使用上述两种技术的优秀教程here。作者还提供了下载代码。
虽然我使用Apache + PHP来实现我的Comet解决方案,但最好切换到非阻塞框架,例如Tornado (Python)。