2010-08-09 2 views
6

Ich erstelle eine Anwendung, um unserem Team bei der Verwaltung eines Twitter-Wettbewerbs zu helfen. Bis jetzt habe ich es geschafft, mit der API fein zu interagieren und eine Reihe von Tweets zurückzugeben, die ich brauche.Twitter-Wettbewerb ~ Speichern von Tweets (PHP & MySQL)

Ich bin schwer zu entscheiden, wie die Speicherung der Tweets in der Datenbank am besten gehandhabt werden kann, wie oft nach ihnen gesucht wird und wie keine Überlappungen oder Lücken entstehen.

Sie können eine maximale Anzahl von 100 Tweets pro Seite erhalten. Im Moment ist meine derzeitige Idee, ein Cron-Skript zu starten, sagen wir einmal alle 5 Minuten oder so und schnapp dir 100 volle Tweets gleichzeitig und schaue durch die DB, um zu sehen, ob ich sie finden kann, bevor ich sie hinzufüge .

Dies hat den offensichtlichen Nachteil von 100 Abfragen alle 5 Minuten gegen die db, und wie viele INSERT gibt es auch. Was ich wirklich nicht mag. Außerdem hätte ich lieber etwas mehr Echtzeit. Da Twitter ein Live-Service ist, liegt es nahe, dass wir unsere Teilnehmerliste aktualisieren, sobald sie eintreten.

Das wirft wieder den Nachteil auf, dass ich Twitter wiederholt abfragen muss, was zwar notwendig ist, aber ich bin mir nicht sicher, ob ich ihre API so hämmern möchte.

Hat jemand Ideen für eine elegante Lösung? Ich muss sicherstellen, dass ich alle Tweets festhalte und niemanden belasse und den db-Benutzer einzigartig halte. Obwohl ich in Erwägung gezogen habe, einfach alles hinzuzufügen und dann die resultierende Tabelle nach Benutzernamen zu gruppieren, aber es ist nicht sauber.

Ich bin glücklich, mit der Display-Seite der Dinge getrennt zu behandeln, da dies nur eine Attraktion von MySQL und Display ist. Aber das Backend-Design bereitet mir Kopfzerbrechen, da ich keinen effizienten Weg sehe, um weiter zu ticken, ohne entweder die API oder die DB zu hämmern.

+0

Gibt es in der Twitter-API-Richtlinie keine Klausel, die besagt, dass Tweets nicht gespeichert werden können? – Noz

Antwort

1

Die Twitter-API bietet eine Streaming-API, das wahrscheinlich ist, was Sie Sie tun möchten, um sicherzustellen, alles erfassen: http://dev.twitter.com/pages/streaming_api_methods

Wenn ich verstehe, was Sie suchen, werden Sie wahrscheinlich eine statuses/filter wollen, verwenden der track Parameter mit den Unterscheidungsmerkmalen (Hashtags, Wörter, Sätze, Orte, Benutzer), die Sie suchen.

Viele Twitter-API-Bibliotheken haben dies eingebaut, aber im Grunde halten Sie eine HTTP-Verbindung offen und Twitter sendet Ihnen kontinuierlich Tweets, wenn sie passieren. Einzelheiten hierzu finden Sie unter streaming API overview. Wenn Ihre Bibliothek dies nicht für Sie erledigt, müssen Sie nach unterbrochenen Verbindungen suchen und die Verbindung wiederherstellen, die Fehlercodes überprüfen usw. - alles in der Übersicht. Wenn Sie sie jedoch hinzufügen, können Sie die Duplikate von vornherein vollständig eliminieren (es sei denn, Sie erlauben nur einen Eintrag pro Benutzer - dies sind jedoch clientseitige Einschränkungen, auf die Sie später eingehen werden).

Wenn du deine DB nicht hämmerst, sobald du Twitter hast, der dir gerade Sachen schickt, hast du die Kontrolle über dein Ende - du könntest deine Tweets leicht eincachen lassen, wenn sie kommen und sie dann schreiben Die db zu gegebener Zeit oder Zählintervalle - schreibe, was auch immer sie gesammelt hat, alle 5 Minuten, oder schreibe, sobald sie 100 Tweets oder beides hat (offensichtlich sind diese Zahlen nur Platzhalter). Dies ist der Zeitpunkt, an dem Sie nach vorhandenen Benutzernamen suchen können. Wenn Sie eine zwischengespeicherte Liste schreiben möchten, können Sie die beste Möglichkeit erhalten, die Dinge effizient zu machen, wie Sie wollen.

Update: Meine Lösung oben ist wahrscheinlich der beste Weg, es zu tun, wenn Sie Live-Ergebnisse zu bekommen (was es scheint, wie Sie tun).Aber wie in einer anderen Antwort erwähnt, ist es vielleicht möglich, einfach die Search API zu verwenden, um Einträge zu sammeln, nachdem der Wettbewerb vorbei ist, und sich nicht darum kümmern, sie überhaupt zu speichern - Sie können Seiten angeben, wenn Sie nach Ergebnissen fragen (wie in der Such-API-Link), aber es gibt Einschränkungen hinsichtlich der Anzahl der Ergebnisse, die Sie insgesamt abrufen können, was dazu führen kann, dass Sie einige Einträge verpassen. Welche Lösung für Ihre Anwendung am besten geeignet ist, bleibt Ihnen überlassen.

+0

Danke, das scheint die flexibelste Lösung zu sein. –

+0

Wenn Sie der ID des Tweets außerdem eine UNIQUE-Einschränkung hinzufügen, können Sie die Tweets aus einer CSV-Datei laden und sich keine Gedanken über Duplikate machen. – Jayrox

+0

Sie PHP 's fputcsv verwenden können, um die Daten, die Sie benötigen, aus dem Tweet in eine flache Datei (sehr schnell) zu speichern. Dann benutze MySQL 'load data local infile' und lade die Tweets in die Datenbank. Dies ist auch sehr schnell. – Jayrox

0

Ich habe Ihre Frage gelesen und es scheint mir, dass Sie bereits gespeicherte Daten von Twitter duplizieren möchten. Ohne nähere Angaben zum Wettbewerb, wie läuft Ihr Lauf ab, wie Nutzer beispielsweise die geschätzte Anzahl von Einträgen eingeben; Es ist unmöglich zu wissen, ob diese Informationen lokal in einer Datenbank gespeichert werden oder nicht. Dies ist der beste Weg, dieses Problem anzugehen.

Vielleicht eine bessere Lösung zu sein, überspringen doppelte Daten lokal speichern und ziehen die Teilnehmer direkt von Twitter, d. H. Wenn Sie versuchen, einen Gewinner zu finden. Sie können doppelte Einträge während des laufenden Codes eliminieren. Sie müssten nur "die nächste Seite" aufrufen, nachdem die 100 bereits eingelesenen Einträge verarbeitet wurden. Obwohl ich nicht sicher bin, ob dies direkt über die Twitter-API möglich ist.

+0

Es ist möglich, und ich habe diese Funktionalität bereits erreicht. Plus für Metriken und Aufzeichnungen, wollen die Jungs das Zeug bei uns sowie auf Twitter archiviert :) –

2

100 Abfragen in 5 Minuten ist nichts. Vor allem, da ein Tweet im Wesentlichen nur 3 Datenelemente enthält: Benutzer-ID, Timestamp, Tweet, Tweet-ID - etwa 170 Zeichen Daten pro Tweet. Wenn Sie Ihre Datenbank nicht auf einem 4,77 MHz 8088 betreiben, blinkt Ihre Datenbank nicht einmal bei dieser Art von "Laden"

+1

Tweets aus der API haben deutlich mehr Daten mit ihnen als 170 Zeichen verbunden. JSON Returns von Twitter pro Tweet können über 3KB sein und sind oft. – Jayrox

0

Ich denke, dass alle X Minuten ein Cron ausgeführt wird und es vom Tweets-Erstellungsdatum abhängen könnte . Sie können Ihre Datenbank abfragen, um das letzte Datum/die letzte Uhrzeit des letzten aufgezeichneten Tweets zu finden, und dann nur Auswahlen ausführen, wenn übereinstimmende Zeiten vorhanden sind, um Duplikate zu verhindern. Wenn Sie dann Ihre Einfügungen in die Datenbank eingeben, verwenden Sie eine oder zwei Einfügeanweisungen, die alle Einträge enthalten, die Sie aufzeichnen möchten, um die Leistung aufrecht zu erhalten.

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

Dies scheint nicht zu intensiv ... hängt auch von der Anzahl der Tweets, die Sie aufnehmen möchten, obwohl. Stellen Sie außerdem sicher, dass die Tabelle ordnungsgemäß indexiert wird.