2010-08-09 245 views
6

我正在创建一个应用程序来帮助我们的团队管理Twitter竞赛。到目前为止,我已经设法与API交互,并返回我需要的一组推文。Twitter竞赛〜储蓄鸣叫(PHP&MySQL)

我正在努力决定处理数据库中推文存储的最佳方式,多久检查一次,以及如何确保没有重叠或空白。

每页最多可以获得100条推文。目前,我目前的想法是运行一个cron脚本,每隔5分钟左右运行一次,并且一次抓取100条推文,然后在添加它们之前通过查看数据库来查看它们是否可以找到它们。

这有一个明显的缺点,即每隔5分钟运行一次针对数据库的100个查询,然而也有很多INSERT。我真的不喜欢。另外我宁愿多一点实时。由于twitter是一项即时服务,因此我们应该尽快更新参赛者名单。

这又一次抛出了不得不反复轮询Twitter的弊端,虽然这可能是必要的,但我不确定我是否想要像这样敲击它们的API。

有没有人对优雅的解决方案有任何想法?我需要确保捕获所有推文,并且不要让任何人离开,并保持db用户的独特性。虽然我已经考虑过只是添加一切,然后用用户名将结果表分组,但它不整洁。

我很高兴分别处理事物的显示方面,因为这只是从MySQL和显示拉。但后端设计让我头痛,因为我无法看到一种有效的方式来保持它不打印api或db。

+0

Twitter API政策中是否有条款说你不能保存推文? – Noz 2013-01-12 00:23:04

回答

1

Twitter的API提供了流媒体的API,它可能是你想做的事,以确保您捕捉一切什么: http://dev.twitter.com/pages/streaming_api_methods

如果我明白你在找什么,你可能会想要一个statuses/filter,使用track参数与您正在寻找的任何区别特征(主题标签,单词,短语,位置,用户)。

许多Twitter API库都内置了这个功能,但基本上保持HTTP连接处于打开状态,并且Twitter在发生时不断发送推文。有关详细信息,请参阅streaming API overview。如果你的图书馆没有为你做,你必须检查丢失的连接和重新连接,检查错误代码等 - 这些都在概述中。但是,当他们进来时添加它们将允许您首先完全消除重复项(除非您只允许每个用户输入一个条目 - 但这是您稍后将要处理的客户端限制)。

只要不敲击数据库,一旦你有Twitter发送给你的东西,你就可以控制你的最终目标 - 你可以很容易地让你的客户端缓存他们进来时的推文,然后将它们写入数据库在给定的时间或计数时间间隔 - 写入无论它每隔5分钟收集一次,或写一次它有100个推文,或两者(显然这些数字只是占位符)。这是当你可以检查现有的用户名时,如果你需要的话 - 写一个缓存列表可以让你有最好的机会让事情变得高效。

更新: 我上面的解决办法可能是这样做,如果你想获得实时的结果(这好像你这样做)的最佳方式。但正如在另一个答案中提到的那样,在比赛结束后仅使用Search API来收集参赛作品就可以了,而不必担心存储它们 - 您可以在询问结果时指定页面(如搜索API链接),但有多少结果可以获取整体,这可能会导致您错过某些条目。什么解决方案最适合您的应用程序取决于您。

+0

谢谢,这似乎是最灵活的解决方案。 – 2010-08-10 08:34:16

+0

此外,如果您向推文的ID添加UNIQUE约束,则可以批量加载来自CSV文件的推文,而不必担心重复内容。 – Jayrox 2010-08-23 20:26:07

+0

您可以使用PHP的'fputcsv'将您需要的数据从推文保存到一个平面文件中(非常快)。然后使用MySQL的'load data local infile'并将批量加载到数据库中。这也是非常快的。 – Jayrox 2010-08-23 20:30:54

0

我读过你的问题,在我看来,你想复制已经存储在Twitter的数据。没有更多关于竞争的细节,例如用户输入的估计数量;无法知道是否将此信息本地存储在数据库中是解决此问题的最佳方法。

可能是一个更好的解决方案,跳过本地存储重复数据并直接从Twitter拖拽参赛者,即当你试图找到胜利者。 您可以在代码运行时即时消除重复条目。一旦完成处理已经获取的100个条目,您只需要调用“下一个页面”。虽然,我不确定这是否可以直接通过Twitter API。

+0

这是可能的,我已经实现了这个功能。此外,对于度量和记录,这些人想要我们提交的内容以及Twitter上的内容:) – 2010-08-10 08:58:03

2

在5分钟内100个查询不算什么。特别是因为推文基本上只有3条与之相关的数据:用户ID,时间戳,推文,推特ID - 比如说,每条推文大约有170个字符的数据。除非你在4.77MHz 8088上运行你的数据库,否则你的数据库甚至不会在那种“负载”下闪烁。

+1

来自API的推文与其相关的数据显着多于170个字符。 json从推特返回的每​​条推文可以超过3KB,并且经常是。 – Jayrox 2010-08-23 20:24:10

0

我认为每X分钟运行一次cron并将其基于推文创建日期。您可以查询您的数据库以查找最后录制的推文的最后日期/时间,然后只在匹配时间时才运行选择以防止重复。然后,当您插入到数据库中时,使用一个或两个包含要记录的所有条目的插入语句来保持性能。

INSERT INTO `tweets` (id, date, ...) VALUES (..., ..., ...), (..., ..., ...), ...; 

这似乎并不过于密集...也取决于你希望虽然记录的鸣叫的次数。另外请确保正确索引表格。