2012-07-26 74 views
0

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

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

的问题,这显然是做一个长轮询Ajax调用时服务器相对人有监视的事件。由于事件是通过PHP脚本注册的,因此没有简单的方法可以注意到该事件,而无需再次轮询数据库以进行更改。这是因为捕获操作在另一个进程中运行,而不是观察长轮询请求。我环顾四周寻找一种可用于这种进程间通信的机制,就像我从Linux下的胖客户端那里了解到的那样。事实上,PHP扩展了信号量,共享内存甚至是posix。但是他们都只存在于linux(或unix like)系统下。尽管通常情况下该应用程序可能会在极少数情况下在MS-Windows系统下使用。

所以我简单的问题是:是否有这通常是对所有(大多数)系统,可以推动这样的事件PHP脚本服务长轮询Ajax请求任何可用的手段?因为我在其他地方已经有了一个事件,所以不经常查询文件或数据库?

回答

0

所以,最初的警告:没有做一些“特殊”,试图做长轮询香草PHP,直到你杀你的服务器会吃资源。

这里是一个很好的基本指南基本基于PHP的长轮询和一些与去“简单”的道路相关的挑战: How do I implement basic "Long Polling"?

至于这样做的真正的跨平台(和简单的足够开始),您可能需要回到某种简单的内部投票 - 但目标应该是确保此操作比客户投票的成本低得多。

其中一条路线将基本上像对待数据库调用(此时您正在进行数据库调用)一样进行处理,并使用一些标准缓存方法。从APC一切,memcached的,轮询一个文件,将所有可能少放负载在服务器上不是让客户建立和拆除连接每一秒。让一个进程将数据放在正确的键中,然后定期在脚本中轮询它们。

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

一旦你达到了这种方法的限制,你可能必须移动到不同的服务器无论如何。