0

我有一个基于 php 的 Web 应用程序,可以捕获数据库表中的某些事件。它还具有这些捕获事件的可视化:一个列出由 ajax 控制的事件的 html 表。

我想添加一个可选的“实时”功能:按下按钮(“打开”)后,从那一刻起捕获的所有事件都将插入到已经可见的表中。必须发生三件事:注意事件、获取事件数据并将其插入表中。为了将服务器负载保持在合理的范围内,我不想使用 ajax 请求轮询新事件,而是更喜欢长轮询策略。

这样做的问题显然是,在进行长轮询 ajax 调用时,服务器对应方必须监视事件。由于事件是由 php 脚本注册的,因此如果不再次轮询数据库以进行更改,就无法简单地注意到该事件。这是因为捕获操作在另一个进程中运行,而不是观察长轮询请求。我环顾四周,为这种进程间通信找到了一种可用的机制,正如我从 linux 下的富客户端所知道的那样。确实有信号量、共享内存甚至 posix 的 php 扩展。然而,它们都只存在于 linux(或类似 unix)系统下。虽然通常情况下,该应用程序可能会在极少数情况下在 MS-Windows 系统下使用。

所以我的简单问题是:在所有(大多数)系统上通常都有什么方法可以将此类事件推送到为长轮询 ajax 请求提供服务的 php 脚本?因为我在其他地方已经有一个事件,所以不需要不断地轮询文件或数据库?

4

1 回答 1

0

所以,最初的警告:如果不做一些“特别”的事情,尝试使用普通 PHP 进行长轮询会消耗资源,直到你杀死你的服务器。

这是一个很好的基于 PHP 的长轮询的基本指南以及一些与走“简单”道路相关的挑战: 如何实现基本的“长轮询”?

就做这个真正跨平台的(并且足够简单开始)而言,您可能需要回退到某种简单的内部轮询 - 但目标应该是确保此操作比拥有客户端成本低得多轮询。

一种方法是本质上将其视为缓存数据库调用(此时您就是这样),并采用一些标准缓存方法。从 APC 到 memcached 再到轮询文件,一切都可能比让客户端每秒建立和断开连接给服务器带来的负载更少。让一个进程将数据放入正确的键中,然后定期在脚本中轮询它们。

以下是对您可能足够跨平台的各种缓存选项的一个很好的概述:http: //simas.posterous.com/php-data-caching-techniques

一旦你达到了这种方法的极限,无论如何你可能不得不转向不同的服务器架构。

于 2012-08-07T00:41:46.090 回答