【问题标题】:How to implement Observer Pattern in PHP with global scope and persistance如何在 PHP 中实现具有全局范围和持久性的观察者模式
【发布时间】:2012-03-28 18:34:59
【问题描述】:

我的目标的基本想法是这样的:

  1. 用户 A 通过表单向submit.php 提交值
  2. 用户 B 监控提交的值,通过服务器发送事件更新,从updates.php 推送。

submit.php 处理将新值写入数据库,以及通知updates.php 中的观察者对象。

混淆点:

  1. updates.php 的每个实例(会话)是否需要自己的观察者,因为每个查看更新的用户都将运行他们自己的脚本实例,还是他们都可以共享同一个全局观察者对象?

  2. 当主题对象加载时,它将从哪里获取观察者对象?我不能存储/休眠观察者,因为它们是活跃的,对吧?

  3. 1234563实际更新用户列表?
  4. 每次提交表单时,如何从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


【解决方案1】:

解释前要记住的重要说明:

设计模式是为解决特定语言相关问题(限制)而创建的解决方案。它们不是语言级别的软件架构设计经验法则。

我不确定您如何查看观察者模式,但无论如何我都会尽力帮助您:

  1. 没有。在您的情况下,会话意味着用户实例。您应该以某种方式使用将处理所有更新实例的单个抽象观察者。全局观察者对象是要走的路;

  2. 是的,它们是活动对象,因为观察者向主题注册了自己。在某些时候你将不得不拦截它们;

  3. 每当 Subject 发生变化时,它都会向所有已注册的 Observer 广播它已更改的信息,并且每个 Observer 都会向 Subject 查询它负责监控的 Subject 状态的子集。我想你可以从中弄清楚;

  4. 这真的是关于实现设计。没有特定的方法可以做到这一点。你可以试试看什么更适合你;

基本上,是的,您可以拥有一个全局 Observer 对象,但这并不是模式的真正重点。

尝试阅读有关 implementation of the Observer pattern 的信息,看看是否对您有帮助。

【讨论】:

  • 我认为问题在于大多数示例(可能是该模式的核心思想)是为了实时或内联更改以获取广播,而在这种情况下,主题是经典的“无状态”对象(意味着它从顶部开始并在到达底部时结束),而观察者处于持久的“实时”状态,需要知道主体何时发生变化,但主体正在被销毁并重新创建每次更改,因此它不是真正的“耦合”,因为每次都必须重新连接观察者。这就是为什么它看起来不对还是我仍然没有抓住重点?
  • 请记住,即使您定期销毁Subject,这并不意味着他是无国籍的。但是,是的,考虑那个具体案例有点模糊。
【解决方案2】:

我建议你调查一下socket.io

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多