15

我是一名 PHP 开发人员,标题基本上说明了一切。但是,我希望获得一些更深入的信息,因为我开始对我所从事的项目的流程应该如何进行感到困惑。

对于(网络)应用程序,我需要实现像 Facebook 这样的功能,它会通知用户有关回复/评论并立即显示这些内容。

我想我可以对 ajax 请求使用长轮询,但这似乎不是一个好的解决方案,因为通知从来都不是即时的,而且资源很重。

因此,如果我理解正确,我应该使用某种形式的套接字,Node.Js 将是一个不错的选择。因此,基于最后一个假设,我现在对工作流程感到困惑。

我想到了两种可能的解决方案:

1) 在我看来,如果我使用 Node.Js,我可以完全跳过使用 PHP,而仅将应用程序基于 Node.js。

2)或者我可以使用 PHP 作为基础,只使用 Node.js 来通知用户并立即显示消息,但使用 PHP 和 Mysql 保存数据。

这两种可能性让我感到困惑,我无法决定什么是“最好的”和最干净的方式。

我对 Node.js 没有太多经验,玩了一段时间。但是在 Node.js 中管理和保存数据似乎很困难,所以这就是我提出选项 2 的原因。

我知道 Facebook 是基于 PHP 构建的,所以我假设他们通过 PHP 保存数据并通过 Node.js 通知/立即显示回复和评论。

有人可以帮我解决这个问题吗?

提前致谢!

编辑: 我刚刚注意到,Stackoverflow 做了类似的事情。我在左上角收到一条通知,在我的问题下方有一个带有“此问题的新答案”的框。我对所使用的技术非常感兴趣。

4

3 回答 3

13

好吧,您可以将 node.js 用于通知,将 PHP 用于您的应用程序。通过谷歌搜索,我发现了关于real-time-notifications 的内容。您也可以将node.js 与 socket.io 一起使用,但这意味着您必须学习新技术,因为您提到您没有使用 node 的经验。

我没有使用它,但你可以检查这个项目,用于 PHP 中的 websockets。

当您有想要通知用户的更新时,您可以使用发布订阅者模式来通知对此更新感兴趣的人。也可以看看Gearman

就我个人而言,我使用了redis 的 pubsub 机制,使用 node.js+socket.io 构建了一个通知系统。每当记录有更新时,就会在相应的频道上发布。如果频道有听众,那么他们会收到通知。我还将最后 20 条通知存储在 Redis 列表中。

该应用程序是用 PHP 构建的。通知系统内置在 node.js 中。它们是看到相同数据的不同应用程序。通信通过 redis 进行。例如在 Facebook 上下文中: 1) 用户更新他的状态。2) PHP 将此存储到数据库和 Redis 3) Redis 知道此更新必须发布到特定用户的状态通道,并且确实如此。4)特定用户的所有朋友都在监听他的状态频道(这里是node.js) 5)node.js用socket.io在浏览器中推送通知

至于 facebook,我读过一篇文章,它使用长轮询来支持旧版浏览器。不过不确定,需要引用...

于 2013-01-30T10:46:27.923 回答
1

AFAIK 这将通过两种简单的方法:

  1. 第一个可能非常简单的方法是向每条记录添加一个布尔列,以确定它是否已收到通知。

  2. 第二种方法是创建一个表来插入所有通知。

但是,我不确定是否有更好的性能替代方法,但第一种方法是我自己通常做的。但我认为 Facebook 使用的是第二种方法,因为它必须将每个人通知给很多用户。

您的问题可能与以下问题重复:
Facebook 之类的通知跟踪(DB 设计)
用于存储用户通知的数据库设计

于 2013-01-30T10:31:28.287 回答
0

您可以使用服务器端事件,它涉及一些 JavaScript,但我认为没有什么过于复杂。

The main bulk of this method is PHP though, so you would just use the PHP to query your DB for notifications and SSE will push them to the user.

It does have some limitations though, most notably it's not supported by IE (huge surprise) thought i'd mention it anyway to let you know of other possibilities.

Hope this helps

于 2013-01-30T10:56:08.250 回答