6


4

Twitterコンペティション〜ツイートの保存(PHP&MySQL)

私たちのチームがツイッターの競争を管理するのに役立つアプリケーションを作成しています。 これまでのところ、APIとうまくやり取りし、必要なツイートのセットを返すことができました。

データベースにツイートを保存する最適な方法、それらをチェックする頻度、重複やギャップがないことを確認する方法を決めるのに苦労しています。

1ページあたり最大100件のツイートを取得できます。 現時点では、私の現在のアイデアは、5分ごとにcronスクリプトを実行し、一度に100個のツイートをすべて取得し、それらをループしてデータベース内を探して見つけることができるかどうかを確認してから追加することです。

これには、データベースに対して5分ごとに100個のクエリを実行するという明らかな欠点がありますが、多くの「INSERT」もあります。 私は本当に好きではありません。 さらに、もう少しリアルタイムで何かをしたいです。 twitterはライブサービスであるため、参加者のリストを入力したらすぐに更新する必要があります。

これもまた、Twitterを繰り返しポーリングしなければならないという欠点を投げかけます。これは、必要かもしれませんが、そのようなAPIをハンマーで打ちたいかどうかはわかりません。

エレガントなソリューションに関するアイデアはありますか? すべてのツイートをキャプチャし、誰も除外しないようにし、dbユーザーを一意に保つ必要があります。 私はすべてを追加して、結果のテーブルをユーザー名でグループ化することを検討しましたが、整然とはしていません。

それはmysqlとディスプレイからのプルであるため、物事のディスプレイ側を個別に処理できることを嬉しく思います。 しかし、バックエンドのデザインは頭痛の種になります。apiまたはdbのどちらかをハンマーで叩かなくても、それを維持する効率的な方法が見当たらないからです。

4 Answer


2


5分間で100のクエリは何もありません。 特に、ツイートには、ユーザーID、タイムスタンプ、ツイート、ツイートIDの3つのデータのみが関連付けられているため、1ツイートあたり約170文字のデータがあります。 4.77MHz 8088でデータベースを実行している場合を除き、データベースはそのような「負荷」でも点滅しません。


1


Twitter APIは、すべてを確実にキャプチャするためにおそらくあなたがしたいことであるストリーミングAPIを提供します:http://dev.twitter.com/pages/streaming_api_methods

私があなたが探しているものを理解しているなら、おそらくあなたが探している識別特性(ハッシュタグ、単語、フレーズ、場所、ユーザー)で track`パラメータを使用して、 statuses / filter`が必要になるでしょう。

多くのTwitter APIライブラリにはこれが組み込まれていますが、基本的にはHTTP接続を開いたままにしておき、Twitterは発生時にツイートを継続的に送信します。 詳細については、http://dev.twitter.com/pages/streaming_api_concepts#connecting [ストリーミングAPIの概要]をご覧ください。 ライブラリがあなたのためにそれをしないなら、あなたはドロップされた接続をチェックし、再接続し、エラーコードをチェックする必要があります-それはすべて概要にあります。 しかし、それらを追加することで、最初から重複を完全に排除することができます(ユーザーごとに1つのエントリのみを許可する場合を除きますが、それは後で対処するクライアント側の制限です)。

DBに打撃を与えない限り、Twitterにあなたのものを送信するだけで、あなたは自分でコントロールできます-クライアントは、受信したツイートを簡単にキャッシュに入れて、与えられたときにデータベースに書き込むことができます時間間隔またはカウント間隔-5分ごとに収集したものを書き込むか、100のツイートがあるか、またはその両方を書き込みます(明らかにこれらの数値は単なるプレースホルダーです)。 これは、必要に応じて既存のユーザー名を確認できる場合です。キャッシュされたリストを作成すると、必要に応じて効率を上げることができます。

*更新:*上記の私のソリューションは、ライブ結果を取得したい場合におそらくそれを行うための最良の方法です(これはあなたのようです)。 しかし、別の回答で言及されているように、コンテスト終了後にエントリーを収集するためにhttp://dev.twitter.com/doc/get/search[Search API]を使用するだけで、保存について心配することはおそらく可能です。それらはすべて-結果を求めるときにページを指定できます(Search APIリンクで説明されています)が、全体で取得できる結果の数には制限があり、一部のエントリが失われる可能性があります。 アプリケーションに最適なソリューションは、ユーザー次第です。


0


私はあなたの質問を読み直しましたが、すでにTwitterに保存されているデータを複製したいと思うようです。 ランニングの競争に関する詳細はありません。たとえば、エントリーの推定量など、ユーザーのエントリー方法。この情報をデータベースにローカルに保存することがこの問題に対処する最善の方法であるかどうかを知ることは不可能です。

より良い解決策は、ローカルに重複データを保存することをスキップし、ツイッターから直接参加者をドラッグすることです。 勝者を見つけようとするとき。 コードの実行中にその場で重複エントリを削除できます。 既に取得した100エントリの処理が終了したら、「次のページ」を呼び出すだけで済みます。 ただし、これがTwitter APIを介して直接可能かどうかはわかりません。


0


X分ごとにcronを実行し、ツイートの作成日に基づいてcronが機能する可能性があると思います。 データベースに問い合わせて、最後に記録されたツイートの最後の日付/時刻を見つけ、重複を防ぐために一致する時刻がある場合にのみselectを実行できます。 次に、データベースへの挿入を行うとき、パフォーマンスを維持するために、記録するすべてのエントリを含む1つまたは2つのinsertステートメントを使用します。

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

これはあまり集中的ではないようです…​また、記録する予定のツイートの数にも依存します。 また、テーブルのインデックスを適切に作成してください。