Beaucoup de mots ci-dessous, désolé - mais je voulais expliquer cette situation bien:meilleure façon de créer séquentielle édition de documents système (Une seule personne peut modifier un document à la fois)
Je suis en train de créer un système qui permet à tout utilisateur connecté de modifier un seul document, mais je ne veux pas que plus d'un utilisateur puisse éditer ce document en même temps.
(Juste pour référence, je prévois d'avoir un nombre indéfini de ces documents sur mon site Web, et les utilisateurs peuvent créer de nouveaux documents Essentiellement, imaginez Google Docs, mais avec un seul utilisateur pouvant éditer un document à la fois).
J'ai actuellement une solution JavaScript/AJAX/PHP qui implique, pour chaque document, une variable stockée dans une base de données qui contient l'identifiant de l'utilisateur qui édite actuellement ce document. Aucun utilisateur ne peut modifier le document tant que l'utilisateur n'a pas terminé et le document
Lorsqu'un utilisateur a terminé son édition (ce qui signifie qu'il a fermé la fenêtre d'édition ou enregistré ses modifications), le document devient accessible à tout utilisateur. autre utilisateur encore une fois ... ou au moins devrait en théorie. Pour l'application que je développe, il est important que le document soit disponible dès que possible. Ce n'est pas un problème si un utilisateur d'édition enregistre ses modifications, mais est un problème si un utilisateur ferme la fenêtre d'édition et n'enregistre aucune modification. Ma configuration actuelle, pour tenir compte du cas de non-sauvegarde, est de faire un appel AJAX périodique, à une page php qui dit essentiellement, "Je suis encore en train d'éditer, donnez-moi encore deux minutes de temps d'édition." Ainsi, si l'utilisateur ferme la page, le document sera accessible à tous dans un délai de deux minutes. C'est trop long pour ce dont j'ai besoin. Je voudrais vraiment faire en sorte que ce soit aussi proche du temps réel que possible (même si un retard de 10 secondes ne serait pas horrible).
Ces documents sont publiquement visibles et leurs statuts sont affichés sous forme de liste. Lorsqu'un utilisateur charge la page "Afficher les documents disponibles", je dois faire une requête pour vérifier l'état de tous les documents récents qui doivent être affichés, rendre les documents avec des dates d'édition expirées et les afficher avec les documents actuellement disponibles. Pourquoi cette méthode est-elle mauvaise? Quand une tonne d'utilisateurs utilisent simultanément cette application Web, cela implique un nombre trop important de requêtes db, de vérifications et de mises à jour AJAX.
Y a-t-il une meilleure façon de procéder? (Je l'espère!)
Autres infos: -J'ai essayé d'utiliser window.unload (pour envoyer un appel AJAX à une page "J'ai terminé l'édition"), mais il n'y a pas assez de temps pour l'appel ajax éxécuter. -Je ne pense pas que mon hébergeur autoriserait l'utilisation de scripts PHP persistants (et je n'ai pas non plus d'expérience avec les scripts php persistants). -Même si je pourrait utiliser un script PHP persistant, je serais préoccupé par le traitement impliqué si je devais exécuter une tonne de ces scripts simultanément. (100? 1000? Plus? Je ne sais pas quelle puissance de traitement pourrait utiliser.) -Je ne suis pas capable d'exécuter des tâches cron. -Si j'ai le script AJAX "Je suis toujours en train d'éditer" de mes clients d'édition, lancé toutes les 10 secondes au lieu de chaque minute, ça va BEAUCOUP d'appels AJAX par seconde si j'ai beaucoup d'utilisateurs, ce qui conduire à beaucoup d'accès DB, ce qui ne serait pas génial.
Je me rends compte que les besoins que j'ai présentés ici excluent probablement un tas de solutions potentiellement bonnes, mais je suis curieux de savoir si quelqu'un peut penser à d'autres méthodes possibles pour le faire.
Merci!
Edit: (Ajout d'une réponse pertinente à un commentaire)
Malheureusement, ce ne sont pas des fichiers réels. Ils sont en quelque sorte fichiers composés virtuels qui sont constitués de contributions individuelles des utilisateurs. Imaginez une seule page qui, au lieu d'être un seul ensemble de texte, était un ensemble de segments de texte soumis en série (de haut en bas) qui se combinent pour constituer le document complet. Chaque segment soumis par l'utilisateur est court et stocké individuellement dans une base de données. --- Bizarre, je sais, mais utile et nécessaire pour ce projet.
Etes-vous sûr que c'est un problème de faire un appel ajax toutes les minutes et de donner 2 minutes supplémentaires de temps d'édition? 1000 éditeurs simultanés ne représenteraient que 17 demandes par seconde, ce qui pourrait être géré sans problème par n'importe quelle plate-forme Web et base de données. En outre, vous pouvez stocker les informations de "verrouillage" dans memcached plutôt que dans la base de données si nécessaire. – gahooa
Hmm ... Je suppose que vous avez raison au sujet de la charge du serveur. Ma configuration actuelle pourrait ne pas être aussi mauvaise que je le pensais. Memcached serait une excellente option dans ce cas, mais mon hôte ne l'offre pas dans le cadre de la version PHP actuelle. Existe-t-il d'autres moyens de définir/obtenir des données en mémoire? – hithere