2010-02-03 9 views
5

Comment puis-je implémenter une fonctionnalité Facebook NewsFeed dans mon application de communauté PHP? Par exemple "X utilisateur a téléchargé une nouvelle photo, Z assister à un événement". Récupérer toutes ces données de différentes tables consomme trop de ressources.Comment sur Facebook comme Newsfeed?

Merci.

Répondre

7

Il y a plusieurs façons de faire cela, mais celle que je suggère est la suivante. Conservez une seule table d'historique contenant tous les enregistrements pour chaque utilisateur, un horodatage et une description de l'action avec des indicateurs (ou des clés prédéfinies) pour le type d'action qui s'est produit. Cela vous permettrait d'interroger sélectivement une seule table pour certains types d'actions et dans un délai défini pour l'affichage. Cependant, avec un grand nombre d'utilisateurs, cette table va se développer rapidement, vous pouvez donc envisager de purger les anciennes données que vous ne réutiliserez pas plus tard. Portez une attention particulière aux index pour garder les requêtes rapides, et pensez à utiliser la mise en cache des requêtes car vous générerez probablement les mêmes résultats fréquemment.

Tant que vous ne prévoyez pas d'utiliser ces données historiques pour auditer les actions des utilisateurs, il est préférable de les vider au bout d'un moment. Si vous avez besoin d'une piste d'audit, vous devrez peut-être envisager de créer une table temp_history pour afficher les actions récentes, puis, dans un CRON, déplacer ses actions récentes vers une table d'audit permanente pour le stockage à long terme.

+1

Merci. C'est tout. – cnkt

1

Je pense que vous avez répondu à votre propre question: extraire les données d'une seule table.

Une approche simple serait que tous vos autres composants puissent parler à un "enregistreur d'événements" central qui enregistre quelque chose pour le flux de nouvelles des utilisateurs.

1

J'ai aimé la solution de Paul (facile avec certains frameworks comme Symfony). Si vous voulez aller plus loin en termes de vitesse, vous pouvez utiliser en plus un système de mise en cache par utilisateur qui interrogera les données et construira de nouveaux flux à la première demande. Récupérez ensuite les données mises en cache sur les demandes suivantes. Le consignateur d'événements efface le cache pour les utilisateurs concernés lorsqu'il est déclenché. Dans le cas de Facebook, je pense qu'ils utilisent une implémentation 'push' ajax pour notifier au client qu'il y a des nouvelles à montrer. Xcache, Apc ou système de cache basé sur un système de fichiers peut vous aider à construire un tel système.

+0

Ne serait pas une bonne idée de créer/modifier l'index de newsfeed sur un nouvel article (image, mise à jour de statut) vient. Ou créer l'index sur une demande est meilleur? (1 = créer des lignes de table d'échange lorsqu'un utilisateur télécharge une photo d'actualités 2 = créer des lignes de table d'actualités lorsque l'utilisateur regarde une page d'échange 1 ou 2?) – cnkt

+0

Les deux sont possibles, pour cibler les performances, vous devez comparer combien de fois son fil de nouvelles par rapport au nombre de fois que les images sont modifiées. Cette opération peut ne pas être triviale, mais si l'application est déjà "live", vous devriez obtenir ces données à partir de statistiques (GA) ou même les fichiers journaux du serveur web – Benoit

3

Commencez par définir ce que vous appelez l'activité sur votre site Web. Une activité peut contenir plusieurs hyperliens. Donc, un tableau multidimensionnel php pourrait aider ici qui peut aller dans la table en tant qu'objet sérialisé.

Say x est maintenant connecté avec y, z, a et b. vous pouvez définir y, z, a et b comme des liens de profil. Dire x a commenté sur y nouvelle photo. Dans ce cas, y devient un nouveau lien hypertexte vers la photo de profil de la personne. Say x est devenu fan du groupe zoozoo. Dans ce cas, zoozoo devient un lien hypertexte vers la page fan. Créez une table d'activité, pour la dimensionner en taille, activez activity_USER_ID, chaque fois qu'un utilisateur s'enregistre, créez cette table et vérifiez que vous n'avez pas besoin de la créer à nouveau. Définir les activités comme dans 1, 2, 3 ou ce que vous pensez être la meilleure activité que les gens pourraient être intéressés par les communautés que vous soutenez.

la structure de la table doit être simple: tableau php d'activité, horodatage. Si vous utilisez jQuery et Ajax pour peupler l'activité comme fait dans facebook avec le défilement de la souris, vous pouvez toujours convertir le tableau php en json et le formater du côté client.

Faites ceci chaque fois que l'utilisateur se connecte.

Si la base d'utilisateurs est grand dire un million alors vous pourriez vouloir mettre dans un système de traitement de l'emploi qui va mettre les événements en event_MM_DD_YYYY et vous pouvez alors faire un traitement par lots de ces événements pour le stocker dans la table d'activité.

N'affichez jamais plus de 10 20 30 activités récentes.

Espérons que cela aide pour vous :)

+0

Je ne recommanderai pas la purge des données. Les gestionnaires veulent être très intéressés à connaître l'activité populaire sur le site Web pour un mois donné, dans ce cas, vous pouvez avoir des emplois cron qui peupleront d'autres tableaux de statistiques qui refléteraient dans le système d'information de gestion. –

Questions connexes