6
votes

Concurrence Twitter ~ Sauvegarde Tweets (PHP & MySQL)

Je crée une application pour aider notre équipe à gérer une compétition Twitter. Jusqu'à présent, j'ai réussi à interagir avec l'API bien et retourne un ensemble de tweets dont j'ai besoin.

J'ai du mal à décider de la meilleure façon de gérer le stockage des tweets dans la base de données, à quelle fréquence les rechercher et comment s'assurer qu'il n'y a pas de chevauchement ni de lacunes.

Vous pouvez obtenir un nombre maximum de 100 tweets par page. Pour le moment, mon idée actuelle est de diriger un script de cron, une fois toutes les 5 minutes environ et accrochez-vous de 100 tweets à la fois, et de la boucler dans la DB pour voir si je peux les trouver, avant de les ajouter, avant de les ajouter .

Ceci a l'inconvénient évident d'exécuter 100 requêtes contre la DB toutes les 5 minutes, et toutefois beaucoup insérer il y a aussi. Ce que je n'aime vraiment pas. De plus, je préférerais beaucoup avoir quelque chose un peu plus en temps réel. Comme Twitter est un service en direct, il s'agit de la raison pour laquelle nous devrions mettre à jour notre liste des participants dès qu'ils entrent.

Cela jette à nouveau un inconvénient d'avoir à sonder à plusieurs reprises Twitter, ce qui pourrait être nécessaire, je ne suis pas sûr de vouloir marteler leur API comme ça.

Quelqu'un a-t-il des idées sur une solution élégante? Je dois m'assurer que je capture toutes les tweets et que je ne quitte personne et de garder l'utilisateur de la DB unique. Bien que j'ai envisagé juste de tout ajouter, puis regrouper la table résultante par nom d'utilisateur, mais ce n'est pas bien rangé.

Je suis heureux de traiter le côté écran des choses séparément car c'est juste une pull de mysql et d'afficher. Mais la conception du backend me donne mal à la tête car je ne peux pas voir un moyen efficace de le conserver sans marteler l'API ou la DB.


1 commentaires

N'y a-t-il pas une clause dans la politique d'API Twitter qui dit que vous ne pouvez pas sauver des tweets?


4 Réponses :


1
votes

L'API Twitter propose une API en streaming qui est probablement ce que vous voulez faire pour vous assurer de tout capturer: http://dev.twitter.com/pages/streaming_api_methods

Si je comprends ce que vous recherchez, vous voudrez probablement un Status / Filtre , à l'aide du paramètre piste avec toutes les caractéristiques distinctives (hashtags, mots, phrases, emplacements, utilisateurs) que vous recherchez.

De nombreuses bibliothèques d'API Twitter ont ceci intégré, mais vous gardez fondamentalement une connexion HTTP ouverte et Twitter vous envoie en permanence des tweets tels qu'ils se produisent. Voir le Streaming API Vue d'ensemble pour plus de détails à ce sujet. Si votre bibliothèque ne le fait pas pour vous, vous devrez vérifier les connexions déposées et la reconnexion, vérifier les codes d'erreur, etc. - c'est tout dans la vue d'ensemble. Mais les ajoutant comme ils sont entrés vous permettront d'éliminer complètement les doublons en premier lieu (à moins que vous n'autorisez qu'une entrée par utilisateur - mais c'est des restrictions côté client que vous allez traiter ultérieurement).

En ce qui n'arrive pas à ne pas marteler votre dB, une fois que vous avez twitter vous envoyant des trucs, vous êtes configuré à votre fin - vous pourriez facilement avoir votre client cache les tweets lorsqu'ils entrent, puis écrivez-les à la DB à des intervalles de temps ou de comptage données - écrivez ce qu'il a rassemblé toutes les 5 minutes ou écrivez une fois que cela dispose de 100 tweets, ou les deux (évidemment, ces chiffres ne sont que des espaces réservés). C'est à ce moment-là que vous pouvez vérifier les noms d'utilisateur existants si vous devez - écrire une liste de mise en cachette vous permettrait de rendre les choses efficaces toutefois que vous le souhaitez.

mise à jour: Ma solution ci-dessus est probablement la meilleure façon de le faire si vous souhaitez obtenir des résultats en direct (ce qui semble que vous ressemblez). Mais comme mentionné dans une autre réponse, il peut être possible de simplement utiliser le API Pour recueillir des entrées après la fin du concours et ne vous inquiétez pas de les stocker du tout - vous pouvez spécifier des pages lorsque vous demandez des résultats (comme indiqué dans le lien API de recherche), mais il y a des limites quant au nombre de résultats que vous pouvez chercher Globalement, ce qui peut vous empêcher de manquer des entrées. Quelle solution fonctionne le mieux pour votre application est à vous de vous.


3 commentaires

Merci, cela semble être la solution la plus flexible.


De plus, si vous ajoutez une contrainte unique à l'ID du Tweet, vous pouvez charger des tweets à partir d'un fichier CSV et ne vous inquiétez pas des doublons.


Vous pouvez utiliser PHP FUPTCSV pour enregistrer les données dont vous avez besoin à partir du Tweet dans un fichier plat (très rapide). Ensuite, utilisez les données MYSQL Infile locale et BULK Chargez les tweets dans la base de données. C'est aussi très vite.



0
votes

J'ai lu sur votre question et il me semble que vous souhaitez dupliquer des données déjà stockées par Twitter. Sans plus de détails sur la concurrence de votre exécution, comment les utilisateurs entrent par exemple, un montant estimé d'entrées; Son impossible à savoir si elle stocke ou non ces informations localement sur une base de données est la meilleure façon d'aborder ce problème.

Pourrait être une meilleure solution pour être, sauter stocker des données en double localement et faire glisser les participants directement à partir de Twitter, c'est-à-dire lorsque vous essayez de trouver un gagnant. Vous pouvez éliminer les entrées en double sur la mouche, puis tandis que le code est en cours d'exécution. Vous auriez juste besoin d'appeler "la page suivante" une fois son traitement fini les 100 entrées déjà extraites. Bien que je ne suis pas sûr que cela soit possible directement via l'API Twitter.


1 commentaires

C'est possible et j'ai déjà atteint cette fonctionnalité. De plus pour les métriques et les enregistrements, les gars veulent que les trucs ont déposé avec nous aussi bien que sur Twitter :)



2
votes

100 requêtes en 5 minutes ne sont rien. Surtout qu'un tweet n'a essentiellement que 3 données associées à celle-ci: ID utilisateur, horodatage, Tweet, Tweet ID - Dites, environ 170 caractères de données par tweet. Sauf si vous exécutez votre base de données sur un 4.77MHz 8088, votre base de données ne clignote même pas sur ce type de "charge"


1 commentaires

Les tweets de l'API ont considérablement plus de données associées à 170 caractères. JSON Les retours de Twitter par Tweet peuvent avoir plus de 3 Ko et sont souvent.



0
votes

Je pense que courir un cron toutes les x minutes et la basant de la date de création Tweets peut fonctionner. Vous pouvez interroger votre base de données pour rechercher la dernière date / heure du dernier Tweet enregistré, puis l'exécution ne sélectionne que s'il y a des moments de correspondance pour éviter les doublons. Ensuite, lorsque vous effectuez vos insertions dans la base de données, utilisez une ou deux instructions d'insertion contenant toutes les entrées que vous souhaitez enregistrer pour conserver les performances.

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


0 commentaires