2010-02-03 20 views
5

Wie kann ich eine Facebook NewsFeed ähnliche Funktion in meiner PHP-basierten Community-Anwendung implementieren? Zum Beispiel "X Benutzer hat ein neues Foto hochgeladen, Z nimmt an einer Veranstaltung teil". Das Abrufen all dieser Daten aus verschiedenen Tabellen verbraucht zu viele Ressourcen.Wie Facebook wie Newsfeed?

Danke.

Antwort

7

Es gibt ein paar verschiedene Möglichkeiten, wie Sie dies tun können, aber die eine, die ich vorschlagen würde, ist dies. Führen Sie eine einzelne "Verlaufs" -Tabelle, die alle Datensätze für jeden Benutzer enthält, einen Zeitstempel und eine Beschreibung der Aktion zusammen mit Flags (oder vordefinierten Schlüsseln) für die Art der Aktion ein. Dies würde es Ihnen ermöglichen, eine einzelne Tabelle selektiv für bestimmte Arten von Aktionen und innerhalb eines festgelegten Zeitfensters abzufragen, um angezeigt zu werden. Bei vielen Benutzern wird diese Tabelle jedoch schnell wachsen, sodass Sie möglicherweise alte Daten bereinigen, von denen Sie wissen, dass Sie sie später nicht mehr verwenden werden. Achten Sie besonders auf Indizes, um die Abfragen schnell zu halten, und ziehen Sie das Zwischenspeichern von Abfragen in Betracht, da Sie wahrscheinlich häufig dieselben Ergebnisse generieren werden.

Solange Sie nicht vorhaben, diese historischen Daten für die Überwachung von Benutzeraktionen zu verwenden, sollte es in Ordnung sein, sie nach einer Weile abzulegen. Wenn Sie einen Audit-Trail benötigen, müssen Sie möglicherweise eine Tabelle "temp_history" erstellen, um die letzten Aktionen anzuzeigen, und dann in einem CRON ihre letzten Aktionen in eine permanente Audit-Tabelle für den Langzeitspeicher verschieben.

+1

Danke. Das ist es. – cnkt

1

Ich denke, Sie haben Ihre eigene Frage beantwortet: Ziehen Sie die Daten aus einer einzigen Tabelle.

Ein einfacher Ansatz wäre, dass all Ihre anderen Komponenten mit einem zentralen "Ereignis-Logger" sprechen können, der etwas für den Nachrichten-Feed der Benutzer aufzeichnet.

1

Ich mochte Pauls Lösung (einfach mit bestimmten Frameworks wie Symfony). Wenn Sie in Sachen Geschwindigkeit noch weiter gehen wollen, können Sie zusätzlich ein benutzerspezifisches Caching-System verwenden, das auf Anfrage nach Daten fragt und neue Feeds erstellt. Rufen Sie anschließend die zwischengespeicherten Daten für die folgenden Anforderungen ab. Der Event-Logger löscht den Cache für betroffene Benutzer, wenn er trigerred ist.

In facebook Fall, ich denke, sie verwenden eine "Push" Ajax-Implementierung, um Client-Seite zu benachrichtigen gibt es Neuigkeiten zu zeigen.

Xcache, Apc oder Dateisystem-Caching-System kann Ihnen helfen, ein solches System zu erstellen.

+0

Es wäre keine gute Idee, den Newsfeed-Index zu erstellen/ändern, wenn ein neues Element (Bild, Statusaktualisierung) kommt. Oder ist es besser, den Index auf Anfrage zu erstellen? (1 = Erstellen von Newsfeed-Tabellenzeilen, wenn ein Benutzer ein Nachrichtenfoto hochlädt. 2 = Erstellen von Newsfeed-Tabellenzeilen, wenn der Benutzer die Newsfeedseite betrachtet. 1 oder 2?) – cnkt

+0

Beide sind möglich, um die Leistung zu vergleichen sein Nachrichtenfeed versus wie oft Bilder verändert werden. Dieser Vorgang ist vielleicht nicht trivial, aber wenn die App bereits "live" gegangen ist, sollten Sie solche Daten von Statistiken (GA) oder sogar Webserver-Logdateien – Benoit

3

Beginnen Sie, indem Sie definieren, was Sie Aktivität auf Ihrer Website nennen. Eine Aktivität kann mehrere Hyperlinks enthalten. Also könnte hier ein mehrdimensionales php-Array helfen, das in der Tabelle als serialisiertes Objekt erscheinen kann.

Sagen x ist jetzt verbunden mit y, z, a und b. Sie können y, z, a und b als Profilverknüpfungen definieren. Say x hat ein neues Foto kommentiert. In diesem Fall werden Sie zu einem neuen Hyperlink zum Profilfoto der Person. Say x wurde ein Fan von Zoozoo Gruppe. In diesem Fall wird zoozoo zu einem Hyperlink zur Fanseite.

Erstellen Sie eine Aktivitätstabelle, um sie groß zu skalieren, machen Sie activity_USER_ID, jedes Mal, wenn ein Benutzer Sie registriert, erstellt diese Tabelle und überprüft, dass Sie sie nicht noch einmal erstellen müssen.

Definieren Sie Aktivitäten wie in 1,2,3 oder was immer Sie für die beste Aktivität halten, die Leute an Communities interessiert, die Sie unterstützen.

Tabellenstruktur sollte einfach sein: Aktivität PHP-Array, Zeitstempel. Wenn Sie jQuery und Ajax verwenden, um die Aktivität zu füllen, wie in facebook mit dem Maus-Scroll, dann können Sie das PHP-Array immer in json konvertieren und auf der Client-Seite formatieren.

dies tun, wann immer Benutzer anmeldet.

Wenn der Benutzer Basis eine Million sagen groß ist dann könnten Sie in einem gewissen Auftragsverarbeitungssystem setzen wollen, welche Ereignisse in event_MM_DD_YYYY setzen und Sie können eine Batch-Verarbeitung dann tun diese Ereignisse, um sie in der Aktivitätstabelle zu speichern.

Nie mehr als 10 20 30 aktuelle Aktivitäten anzeigen.

Hoffe das hilft für Sie :)

+0

Ich werde nicht empfehlen, Daten zu bereinigen. Manager möchten sehr interessiert sein, populäre Aktivitäten auf der Website für einen bestimmten Monat zu kennen. In diesem Fall können Sie Cron-Jobs haben, die einige andere Statistiktabellen füllen, die sich im Management Information System widerspiegeln. –

Verwandte Themen