【发布时间】:2012-03-28 18:34:59
【问题描述】:
我的目标的基本想法是这样的:
- 用户 A 通过表单向
submit.php提交值 - 用户 B 监控提交的值,通过服务器发送事件更新,从
updates.php推送。
submit.php 处理将新值写入数据库,以及通知updates.php 中的观察者对象。
混淆点:
updates.php的每个实例(会话)是否需要自己的观察者,因为每个查看更新的用户都将运行他们自己的脚本实例,还是他们都可以共享同一个全局观察者对象?当主题对象加载时,它将从哪里获取观察者对象?我不能存储/休眠观察者,因为它们是活跃的,对吧?
1234563实际更新用户列表?
每次提交表单时,如何从
submit.php存储/检索 ObjectStorage 对象?显然我不能使用会话,对吧?因为这些是每个用户的?
短版:有没有办法在观察者是活动对象的主体端获取包含观察者的全局持久对象?
如果有更好或更简单的方法来实现这个想法(或者如果我完全困惑并需要教育),请告诉我。但我并不是在寻找一个已经可以做到这一切的框架,因为我正在尝试使用这个项目来更好地理解观察者模式作为一个想法。
【问题讨论】:
-
您需要持久存储,因为 PHP 缺乏对此类变量的支持,您可以将对象存储到 Memcached 或 Redis(如果可用),或者序列化到文件。我认为您在这里不需要观察者,据我了解您想要实施。也许单独的表格来跟踪查看的提交?
-
Memcache 是全局的?使用观察者的想法是避免强制
updates.php轮询更改,因为我认为这只是将轮询问题从浏览器传递到服务器,从而减少了实现服务器发送事件的好处。观察者不是轮询的理想服务器端替代方案吗? -
您无法在浏览器和服务器之间设置真正的观察者模式。您可以做的最好的事情是执行一个没有超时的 AJAX 调用,并执行一个也没有超时的服务器端 PHP,并监视数据库、文件或会话变量的更改。正如您可能知道的那样,这存在更大的问题。投票模式是你能得到的最好的。
-
Memcache 是全球性的,您仍然需要以某种方式通知客户端更改已发生(触发事件),websockets?
-
@alickus : 服务器发送的事件是 HTML5 中的另一种持久连接,类似于 websockets,但只是服务器到客户端,不是双向的。
标签: php html publish-subscribe observer-pattern server-sent-events