Wie kann ich diesen PHP / MySQL News Feed verbessern?

Lassen Sie mich beginnen rechts von der Fledermaus sagen, dass ich weiß, das ist nicht die beste Lösung. Ich weiß, es ist notdürftigem und ein Einbruch in eine Funktion. Aber das ist der Grund, warum ich hier bin!

Diese Frage/Arbeit baut auf einige Diskussion auf Quora mit Andrew Bosworth, der Schöpfer von Facebook ' s news feed.

Baue ich ein news-feed der Arten. Es ist gebaut, allein in PHP und MySQL.

Wie kann ich diesen PHP /MySQL News Feed verbessern?


Die MySQL

Das relationale Modell für die Einspeisung besteht aus zwei Tabellen. Ein Tisch fungiert als eine Aktivität protokollieren; in der Tat, es ist benannt activity_log. Die andere Tabelle ist newsfeed. Diese Tabellen sind fast identisch.

Den schema für die log - ist activity_log(uid INT(11), activity ENUM, activity_id INT(11), title TEXT, date TIMESTAMP)

...und die schema für die feed ist newsfeed(uid INT(11), poster_uid INT(11), activity ENUM, activity_id INT(11), title TEXT, date TIMESTAMP).

Jedes mal, wenn ein Benutzer etwas tut, relevant für die news-feed, zum Beispiel die Frage, es wird protokolliert, um die Aktivität log sofort.


Generieren die news-feeds

Dann alle X Minuten (5 Minuten im moment, wird sich ändern, auf 15-30 Minuten später), ich einen cron-job , führt das Skript unten. Dieses Skript durchläuft alle Benutzer in der Datenbank, findet alle Aktivitäten, die für alle Benutzer, Freunde, und schreibt dann diese Aktivitäten auf der news-feed.

In dem moment, das SQL entnimmt, dass die Aktivität (genannt in ActivityLog::getUsersActivity()) hat eine LIMIT 100 verhängt Leistung* Gründen. *Nicht, dass ich weiß, wovon ich spreche.

<?php

$user = new User();
$activityLog = new ActivityLog();
$friend = new Friend();
$newsFeed = new NewsFeed();

//Get all the users
$usersArray = $user->getAllUsers();
foreach($usersArray as $userArray) {

  $uid = $userArray['uid'];

  //Get the user's friends
  $friendsJSON = $friend->getFriends($uid);
  $friendsArray = json_decode($friendsJSON, true);

  //Get the activity of each friend
  foreach($friendsArray as $friendArray) {
    $array = $activityLog->getUsersActivity($friendArray['fid2']);

    //Only write if the user has activity
    if(!empty($array)) {

      //Add each piece of activity to the news feed
      foreach($array as $news) {
        $newsFeed->addNews($uid, $friendArray['fid2'], $news['activity'], $news['activity_id'], $news['title'], $news['time']);
      }
    }
  }
}

Anzeige des news-feeds

In den client-code, der beim abrufen des Benutzers news-feed, ich glaube so etwas wie:

$feedArray = $newsFeed->getUsersFeedWithLimitAndOffset($uid, 25, 0);

foreach($feedArray as $feedItem) {

//Use a switch to determine the activity type here, and display based on type
//e.g. User Name asked A Question
//where "A Question" == $feedItem['title'];

}

Verbesserung der news-feed

Nun vergib meinem begrenzten Verständnis der best practices für die Entwicklung einer news-feed, aber ich verstehe den Ansatz, den ich verwende, um eine eingeschränkte version, was heißt fan-out-on-write -, begrenzt in dem Sinne, dass ich bin mit einem cron-job als Zwischenschritt statt zu schreiben, um den Benutzer " news-feeds direkt. Aber dies unterscheidet sich sehr von einem pull-Modell, in dem Sinne, dass der Nutzer den news-feed wird nicht kompiliert, die auf Belastung, sondern auf einer regulären basis.

Dies ist eine große Frage, die sich wohl verdient ein große Menge hin und her, aber ich denke, es kann dienen als ein Prüfstein für viele wichtige Gespräche, die der neue Entwickler wie mich haben müssen. Ich versuche nur, um herauszufinden, was ich falsch mache, wie kann ich verbessern, oder wie darf ich das vielleicht sogar von vorne anfangen und versuchen einen anderen Ansatz.

Eine andere Sache, die nervt mich an diesem Modell ist, dass es funktioniert, basierend auf Neuheit statt Relevanz. Wenn jemand vorschlagen kann, wie dies verbessert werden kann, um Arbeit Relevanz haben, ich wäre ganz Ohr. Ich bin mit dem Gerichteten Kante API, um Empfehlungen zu generieren, aber es scheint, dass so etwas wie ein news-feed, Empfehler wird nicht funktionieren (da nichts war Favoriten bisher!).

Kommentar zu dem Problem - Öffnen
@Josh Versuchen 🙂 Kommentarautor: alex
@Josh Verstehste? Haha! Kommentarautor: alex
@Josh Smith braucht jeder Benutzer einen newsfeed Tabelle? Kommentarautor: chromedude
@josh smith, Wenn Sie erstellen Sie Ihre oben beschriebenen Algorithmus, bitte veröffentlichen Sie es. Dank Kommentarautor: namal
@JoshSmith, führen Sie eine SQL-Abfrage für jeden Freund schnappen Sie sich Ihre Aktivitäten? Kommentarautor: John Smith

InformationsquelleAutor der Frage Josh Smith | 2010-11-12

Schreibe einen Kommentar