Как Facebook, как лента новостей? - PullRequest
5 голосов
/ 03 февраля 2010

Как я могу реализовать функцию, похожую на Facebook NewsFeed, в своем приложении для сообщества на основе PHP? Например, «Пользователь X загрузил новую фотографию, Z посетил событие». Извлечение всех этих данных из разных таблиц потребляет слишком много ресурсов.

Спасибо.

Ответы [ 4 ]

7 голосов
/ 03 февраля 2010

Есть несколько способов сделать это, но я бы предложил следующее.Сохраняйте единственную таблицу «истории», в которой хранятся все записи для каждого пользователя, отметку времени и описание действия, а также флаги (или предопределенные ключи) для типа выполняемого действия.Это позволит вам выборочно запрашивать одну таблицу для определенных типов действий и в течение определенного периода времени для отображения.Однако у многих пользователей эта таблица будет быстро расти, поэтому вы можете подумать об удалении старых данных, которые, как вы знаете, не будут использоваться позже.Обратите внимание на индексы, чтобы обеспечить быстрое выполнение запросов, и рассмотрите возможность использования кэширования запросов, поскольку вы, вероятно, будете часто генерировать одни и те же результаты.

Пока вы не планируете использовать эти исторические данные для аудита действий пользователейтогда должно быть хорошо, чтобы сбросить его через некоторое время.Если вам нужен контрольный журнал, вам может потребоваться создать таблицу temp_history для отображения последних действий, а затем в CRON переместить их последние действия в постоянную таблицу аудита для длительного хранения.

3 голосов
/ 03 февраля 2010

Начните с определения того, что вы называете деятельностью на вашем сайте. Деятельность может содержать несколько гиперссылок. Так что здесь может помочь многомерный массив php, который может попасть в таблицу как сериализованный объект.

Скажем, x теперь связан с y, z, a и b. Вы можете определить y, z, a и b как ссылки профиля. Скажи х прокомментировал у новое фото. В этом случае y становится новой гиперссылкой на фотографию профиля человека. Скажем, Х стал фанатом группы zoozoo. В этом случае zoozoo становится гиперссылкой на фан-страницу.

Создайте таблицу действий, чтобы увеличить ее, сделайте ее activity_USER_ID, каждый раз, когда пользователь регистрируется, вы создаете эту таблицу и проверяете, что вам не нужно создавать ее снова.

Определите действия, как в пунктах 1, 2, 3, или как вы считаете, это лучшее, что может заинтересовать людей в тех сообществах, которые вы поддерживаете.

структура таблицы должна быть простой: массив php активности, отметка времени. Если вы используете jQuery и Ajax для заполнения действия, как это было сделано в Facebook, с помощью прокрутки мыши, вы всегда можете преобразовать массив php в json и отформатировать его на стороне клиента.

Делайте это всякий раз, когда пользователь входит в систему.

Если пользовательская база велика, скажем, миллион, то вы, возможно, захотите добавить какую-нибудь систему обработки заданий, которая будет помещать события в event_MM_DD_YYYY, и затем вы можете выполнить пакетную обработку этих событий, чтобы сохранить ее в таблице действий.

Никогда не отображать более 10 20 30 последних действий.

Надеюсь, это поможет вам :)

1 голос
/ 03 февраля 2010

Мне понравилось решение Пола (легко с некоторыми фреймворками, такими как Symfony).Если вы не хотите идти дальше с точки зрения скорости, вы можете дополнительно использовать систему кэширования для каждого пользователя, которая будет запрашивать данные и создавать новые каналы по первому запросу.Затем извлеките кэшированные данные по следующим запросам.Регистратор событий очистит кэш для заинтересованных пользователей при срабатывании.

В случае с Facebook, я думаю, что они используют реализацию «push» ajax, чтобы сообщить клиенту, что есть новости для показа.система.

1 голос
/ 03 февраля 2010

Я думаю, что вы ответили на свой вопрос: извлеките данные из одной таблицы.

Простой подход состоит в том, что все остальные ваши компоненты могут общаться с центральным «регистратором событий», который записывает что-то для новостной ленты пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...