2010-08-30 104 views
9

如何设置类似Facebook的通知系统: - 用户A向用户B写入消息 - 数据库的侦听器将消息路由到用户B - 在用户界面上,该消息立即出现php中的类似facebook的通知系统

我该怎么做,在PHP?

非常感谢你,

问候

+0

我很欣赏你的想法。你有一段代码要分享吗? 再次感谢。 – Zakaria 2010-08-30 21:19:19

+0

这是一个非常复杂的系统。最好的做法是自己尝试一下,并询问你遇到困难的具体问题。如果你要我为你写信或者为虚拟1对1坐下,我很乐意向你收取我的标准费用。 – bradenkeith 2010-08-31 12:19:33

回答

0

你可以这样做一个有两种方式。在PHP中,最简单的方法是“轮询”。较新的整洁方法是使用HTTP Push与Comet服务器;但对于PHP来说并不是那么好。

要使用轮询,只需更新数据库中的一个表,并将UserA的消息标记为将要传递给用户b。你有一个脚本每隔几秒钟通过ajax轮询数据库中的消息在用户的客户端上运行。如果消息在那里,则填充它。这是非常低效的。

3

我有一套系统可以正常工作。它主要有建立这样的:

notification_id
USER_ID
模块
ACTION_TYPE
added_by
阅读
read_date
添加

这是做一个简单的方法。 user_id是谁的用途,added_by是执行操作的用户的用户标识。模块是它在哪里执行的,action_type是发生了什么(注释,删除,添加等)。如果它已被查看,则为Read,read_date为查看时。

然后,我有一个类,它建立在上面的值基础上的措词。

我已经设置了一个crontab,在这么多天之后会清理数据库中的旧通知。

0

Comet服务器在PHP中编写起来并不那么简单,但可以使用sleep来完成。 也有插座的功能,可以是有用的:

请注意,您应该知道的时间限制。也许你应该停止一段时间后挂起并提出新的请求,除非你可以禁用这些请求的时间限制。

该解决方案也可能取决于环境。在通常的共享虚拟主机上你可能无法做很多有用的事情。

+1

这是一个可怕的想法。 PHP不适用于长时间轮询。 – 2010-11-13 05:49:54

0

正如akellehe所提到的,如果您的用户可能长时间处于同一页面,您可以使用Ajax进行轮询以查找新内容。如果绝对实时传递不是必需的,那么在页面重新加载时检查新的通知会更加有效 - 尤其是在缓存(例如,缓存)时。memcached)等待用户的总事件,并且只有在事件被添加到其通知队列中时才会使该计数失效。这将为您节省大量无用的数据库查询。

7

我不会建议使用轮询或尝试使用PHP实现基于推送的解决方案,如果你将有任何可观的流量。会发生什么最终会阻止所有的PHP进程,然后你无法再服务于Web请求。

查看node.js,cometd或其他基于推送的解决方案。如果你需要一些简单的东西,并且需要快速启动并运行,我建议使用http://pusherapp.com/。他们有一个PHP客户端可用和超级简单的API。

0

现在非常可能。我知道这个答案很快就会到来,但它会帮助那些将查看此页面寻求帮助的人。查看下面的链接以获得一个很好的教程Real Time Notification Like Facebook

0

时下最好的解决方案是使用socket.io(http://socket.io/)。它会自动选择最佳(和可用!)方式来传输数据,包括:WebSockets,Adobe Flash Socket,Ajax轮询。 你真的不用担心客户端通信方法的可用性。