如何在Facebook上像新闻源一样浏览?

5
我应该如何在基于PHP的社区应用中实现类似Facebook NewsFeed的功能?例如,“X用户上传了新照片,Z参加了一个活动”。从不同的表中获取所有这些数据会消耗太多资源。谢谢。
4个回答

7
有几种不同的方法可以做到这一点,但我建议的是:保留一个单独的“历史记录”表,其中包含每个用户的所有记录、时间戳以及行动描述和标志(或预定义键),以表示发生的操作类型。这样,您就可以有选择地查询单个表以显示特定类型的操作,并在一定时间范围内进行查询。然而,对于许多用户来说,这个表会很快增长,因此您可能需要清除您知道将来不会再使用的旧数据。请注意索引以保持查询速度,并考虑使用查询缓存,因为您可能经常生成相同的结果。
只要您不打算使用此历史数据审计用户操作,那么在一段时间后倾倒它应该是可以的。如果您确实需要审计跟踪,则需要考虑创建一个temp_history表来显示最近的操作,然后在CRON中将他们的最近操作移动到永久审计表中进行长期存储。

3

首先,定义您网站上的活动。一个活动可以包含多个超链接。因此,一个PHP多维数组可能会有所帮助,它可以作为序列化对象放入表中。

假设x现在与y、z、a和b相连。您可以将y、z、a和b定义为个人资料链接。例如,x评论了y的新照片。在这种情况下,y成为指向该人资料照片的新超链接。例如,x成为了Zoozoo小组的粉丝。在这种情况下,Zoozoo成为指向粉丝页面的超链接。

创建一个活动表,为了扩展它,使其变得更大,将其命名为activity_USER_ID,每次用户注册时,您都要创建此表并检查您是否需要再次创建它。

按照1、2、3或您认为最好的活动方式来定义活动,以便您支持的社区中的人们感兴趣。

表结构应该很简单:活动php数组,时间戳。如果您正在使用jQuery和Ajax来填充活动,就像Facebook中使用鼠标滚轮一样,那么您可以将php数组转换为json,并在客户端上进行格式化。

每当用户登录时,请执行此操作。

如果用户基数很大,比如一百万,则您可能需要放置一些作业处理系统,该系统将在event_MM_DD_YYYY中放置事件,然后您可以对这些事件进行批量处理以将其存储在活动表中。

永远不要显示超过10 20 30个最近的活动。

希望这可以帮助您 :)


我不建议清除数据。经理们非常希望了解特定月份网站上的热门活动,这种情况下,您可以编写cron作业,填充其他统计表,在管理信息系统中反映出来。 - Pradeep Sharma

1

我认为你已经回答了自己的问题:从单个表中提取数据。

一个简单的方法是,所有其他组件都可以与一个中央的“事件记录器”进行通信,该记录器会为用户的新闻提要记录一些内容。


1

我喜欢Paul的解决方案(对于像Symfony这样的某些框架非常容易)。 如果你想要更进一步提高速度,可以使用一个针对每个用户的缓存系统,在第一次请求时查询数据并建立新的feeds。然后在后续的请求中检索缓存数据。 当触发事件日志记录器时,将清除相关用户的缓存。

在Facebook的情况下,他们使用'push' ajax实现来通知客户端有新闻要展示。

Xcache、Apc或基于文件系统的缓存系统可以帮助您构建这样一个系统。


当有新的内容(图片、状态更新)出现时,创建/修改新闻源索引是否是一个好主意?还是在请求时创建索引更好?(1 = 当用户上传新闻照片时创建新闻源表行。2 = 当用户查看新闻源页面时创建新闻源表行。1或2?) - cnkt
两种方法都是可行的,为了提高性能,您应该比较单个用户请求其新闻提要的次数与修改图片的次数。这个操作可能不是很简单,但如果应用程序已经上线,您应该从统计数据(GA)甚至是Web服务器日志文件中获取这些数据。 - Benoit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接