Bana bu en iyi çözüm değil biliyorum söyleyerek sağ yarasa kapalı başlayalım. Ben kıytırık bir özelliğin kesmek olduğunu biliyorum. But that's why I'm here!
Bu soru / çalışma Facebook'un haber besleme some discussion on Quora with Andrew Bosworth, yaratıcısı kapalı oluşturur.
I'm building a news feed tür. Bu sadece PHP
ve MySQL
yerleşik.
The MySQL
Besleme için Bağıntısal model, iki tablo oluşmaktadır. Bir etkinlik günlüğüne gibi bir tablo fonksiyonları; Aslında, bu activity_log
olarak adlandırılmıştır. Diğer tablo newsfeed
. These tables are nearly identical.
schema for the log olan activity_log(uid INT(11), activity ENUM, activity_id INT(11), title TEXT, date TIMESTAMP)
... Ve schema for the feed olup newsfeed(uid INT(11), poster_uid INT(11), activity ENUM, activity_id INT(11), title TEXT, date TIMESTAMP)
.
Any time a user does something news feed ilgili, örneğin bir soru soran, it will get logged to the activity log hemen.
Generating the news feeds
Sonra every X minutes Aşağıdaki komut dosyasını çalıştırır, I run a cron job (şu anda 5 dakika, sonra 15-30 dakika değişecektir). Bu komut dosyası veritabanındaki tüm kullanıcıları yoluyla, o kullanıcının tüm arkadaşlarıma tüm faaliyetleri bulur ve daha sonra haber beslemesine bu etkinlikleri yazar döngüler.
Şu anda, SQL
(in adı ActivityLog::getUsersActivity()
) aktiviteye sahip itlafların bir LIMIT 100
performansı * nedenlerle vermiştir. * Ben neden bahsettiğimi biliyorsun değil.
<?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']);
}
}
}
}
Displaying the news feeds
Kullanıcının news feed alınırken müşteri kodu, ben gibi bir şey yapın:
$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'];
}
Improving the news feed
Şimdi bir haber besleme geliştirmek için en iyi uygulamaların benim sınırlı anlayış affet, ama ben koşuyorum anlamda sınırlı fan-out on write denen sınırlı bir versiyonu olmak için kullanıyorum yaklaşımı anlamak bir yerine kullanıcıların haberlere yazılı bir ara adım olarak cron işi doğrudan beslenir. Ama bu kullanıcının news feed yük derlenmiş, ama oldukça düzenli olarak olmadığını anlamda bir çekme modelinden çok farklıdır.
Bu muhtemelen ileri geri bir büyük miktarda hak ve büyük bir soru, ama ben kendim gibi yeni geliştiriciler olması gereken birçok önemli konuşmalar için bir mihenk taşı olarak hizmet düşünüyorum. Ben sadece nasıl geliştirebileceğimizi, ben ne yapıyorum yanlış anlamaya çalışıyorum, ya da nasıl ben belki de sıfırdan başlamak ve farklı bir yaklaşım denemelisiniz.
Bu model ile ilgili hata bana oldukça alaka daha sonralık dayalı çalışır olmasıdır başka bir şey. Herkes bu alaka çalışmak nasıl geliştirilebilir önerebilirsiniz, ben bütün kulakları olurdu. Ben öneriler üretmek için Yönlendirilmiş Edge'in API kullanıyorum, ama bir haber besleme gibi bir şey için, Recommenders işe yaramaz gibi görünüyor (hiçbir şey önceden favorited oldu çünkü!).