如何建立类似facebook的通知系统: - userA将消息写入userB - 数据库上的侦听器将消息路由到userB - 在userB界面上,消息立即显示
我怎么能在php中做到这一点?
非常感谢,
此致
答案 0 :(得分:7)
如果您要获得任何可观的流量,我建议不要使用轮询或尝试使用PHP实现基于推送的解决方案。最终会导致所有PHP进程被阻止,然后您无法再提供Web请求。
查看node.js,cometd或其他基于推送的解决方案。如果您需要简单的东西并且需要快速启动并运行,我建议http://pusherapp.com/。他们有一个PHP客户端和超级简单的API。
答案 1 :(得分:3)
我的系统运行良好。它基本上有这样的设置:
notification_id
USER_ID
模块
ACTION_TYPE
added_by
阅读
read_date
加入
这是一种简单的方法。 user_id是它的用户,added_by是执行操作的任何人的用户ID。模块是执行它的地方,action_type是发生的事情(评论,删除,添加等)。读取是否已被查看,read_date是查看时间。
然后我有一个类根据上面的值来构建词汇。
然后我设置了一个crontab,它将在这么多天后清理数据库中的旧通知。
答案 2 :(得分:0)
您可以通过以下两种方式之一完成此操作。在PHP中,最简单的方法是“轮询”。较新的neater方法是使用带有Comet服务器的HTTP Push;但这对PHP来说并不是那么好。
要使用轮询,只需更新数据库中的表,并将UserA的消息标记为要传递给用户b。您有一个脚本每隔几秒钟通过ajax运行一次,该脚本轮询数据库以查找userb客户端上的消息。如果有消息,则填充它。这是非常低效的。
答案 3 :(得分:0)
使用PHP编写Comet服务器并不是那么简单,但可以使用sleep来实现。 还有一些有用的套接字函数:
请注意,您应该了解时间限制。也许您应该在一段时间后停止挂起并提出新请求,除非您可以禁用这些请求的时间限制。
解决方案也可能取决于环境。您可能无法在通常的共享虚拟主机上做很多有用的事情。
答案 4 :(得分:0)
正如akellehe所提到的,如果您的用户很可能长时间保持在同一页面上,您可以使用Ajax轮询查找新内容。如果绝对实时传送不是必需的,则在页面重新加载时检查新通知会更有效 - 特别是如果您缓存(例如,memcached)等待用户的总事件并且仅在事件中使该计数无效某些内容会添加到其通知队列中。这将为您节省大量空手数据库查询。
答案 5 :(得分:0)
现在很有可能。我知道这个答案来得很晚,但它会帮助那些查看此页面寻求帮助的人。请查看下面的链接,获取精彩的教程Real Time Notification Like Facebook
答案 6 :(得分:0)
现在最好的解决方案是使用socket.io(http://socket.io/)。它会自动选择最好的(也是可用的!)方式来传输数据,包括:WebSockets,Adobe Flash Socket,Ajax轮询。 您真的不担心客户端的通信方法的可用性。