2012-07-11 4 views
1

Pardonnez l'absence de question. J'essaye de construire un site Web avec les mêmes fonctions qu'un forum de discussion. L'idée de 5 à 50 spectateurs dans chaque chambre (avec des milliers de chambres) est très réelle, seulement environ 1% de la salle serait bavarder.Salle de discussion évolutive utilisant PHP/MySQL?

J'ai eu quelques idées, mais tout ce que j'ai imaginé semble nécessiter une puissance de traitement folle ... Quelle serait une manière efficace de faire cela?

Répondre

1

Vous avez posé une question très large, mais:

magasin chaque message comme une ligne dans votre base de données, utilisez AJAX pour recharger le contenu de la fenêtre de discussion avec les derniers messages par exemple

SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' ORDER BY `id` DESC LIMIT 100 

Sélectionne les 100 messages les plus récents pour le salon de discussion. Boucle sur les résultats et affiche tous les messages que vous voulez.

Si votre base de données utilisateur dispose des autorisations pour créer des tables, vous pouvez aussi créer dynamiquement une table pour chaque salle de chat (ce qui serait beaucoup plus rapide performances sage)

Vous auriez alors avez simplement un input ou textarea dans un formulaire qui, une fois soumis, insère une nouvelle ligne dans la base de données (qui s'affichera pour tout le monde la prochaine fois que la fenêtre de discussion sera rechargée). Un autre moyen, plus optimisé, consiste à renvoyer uniquement les nouveaux messages aux utilisateurs à chaque requête, en stockant l'horodatage de chaque message dans la base de données, et en stockant l'horodatage de la dernière requête localement en JavaScript, puis utilisez un requête comme:

SELECT * FROM `chat_messages` WHERE `room_id` = 'ID' AND `timestamp` > 'LAST_REQUEST' ORDER BY `id` DESC LIMIT 100 

Puis en ajoutant le résultat à la fenêtre de discussion, plutôt que de le remplacer.

+0

Mais cela ne va-t-il pas paralyser mon serveur? 1000 utilisateurs faisant 100 * sélectionne chaque seconde? – user1516606

+0

En supposant que vous vous rafraîchissez une fois par seconde, est-ce que ce ne sont pas 1000 utilisateurs qui font 1 select par seconde? – wyqydsyq

+0

Désolé typo, mais toujours avec le nombre d'utilisateurs que je prévois de maintenir je ne pense pas que mon serveur pourrait le gérer. – user1516606

2

Il existe des programmes spécifiques prévus à cet effet (IRCD, voir http://www.atheme.org/project/charybdis et similaires). Cependant, si vous voulez vraiment réinventer la roue, vous voudrez probablement une solution d'hébergement qui a une bonne quantité de RAM physique, et mémoire partagée extensions (ex. APC)

fonctionnalité de mémoire partagée (APC dans ce cas) sera le meilleur moyen de garder les conversations de tout le monde dans la synchro, sans disque dur tourner trop ou autre spirale MySQL sur de contrôle. Vous devriez être capable de gérer des centaines de requêtes simultanées de cette façon sans que le serveur ne vous dérange, car il ne taxe pas MySQL. Il lit presque directement les puces RAM.

Vous pouvez mémoriser des canaux individuels pour des conversations (ex: "channel- # welcome") et les interroger directement via AJAX. Voir apc_store, apc_add et apc_fetch pour plus d'informations.

Même si vous finissez par stocker des conversations dans MySQL pour quelque raison que ce soit, il est toujours préférable d'utiliser une sorte de mémoire cache pour la lecture, car cela prend énormément de charge sur le serveur de base de données.

Si vous le faites de cette façon, il est préférable de rendre vos bases de données innodb, car elles ne verrouilleront pas pendant les écritures. En utilisant APC, votre réactif limitant sera la quantité de RAM et la longueur des conversations que vous avez l'intention de garder dans le tampon partagé.

+0

Appréciez la réponse longue, très intéressante. Recommanderiez-vous la méthode APC sur Comet? (http://stackoverflow.com/questions/4174521/how-to-implement-a-chat-room-using-jquery-php?rq=1) – user1516606

+0

s'il vous plaît s'il vous plaît s'il vous plaît ne pas réinventer cette roue. Prenez une première partie de ses conseils et utilisez un programme déjà conçu pour gérer le chat. Construire un serveur de chat en PHP et MySQL est une idée terrible. –

+0

@GavinTowey merci pour le conseil, mais comprendre/mettre en œuvre ircd/charybdis semble être bien au-dessus de mon niveau de compétence. Je suis heureux de ne pas utiliser MySQL, aussi longtemps que j'ai une bonne compréhension de la façon dont le code fonctionne, donc si le problème survient plus tard, je peux voir ce qui s'est mal passé. – user1516606

Questions connexes