Bonsoir à tous,
Pour mon projet Galaxia Online, je vais devoir gérer les files d'attentes de construction. Pour mettre un peu dans le contexte, un joueur peut construire un objet (batiment/vaisseau spatial), sur un certain système. Chaque système possède une valeur appelée Production, et chaque objet possède un coût en construction.
Par exemple, sur mon système nommé "Terminus", j'ai une valeur de production de 6, et je veux construire une amélioration qui coûte 40 de production. Attention, la production n'est pas stockable : c'est en fait une valeur de vitesse. Avoir 6 en production, ça signifie que je, par exemple, je construis à la vitesse de 6 production/minute. Ainsi, il me faudra 6mn40 secondes pour produire cette amélioration.
Voilà pour l'exemple, venons-en à ma question.
À chaque construcion, un objet nommé "Construction" est créé. Il contient l'objet en cours de création, l'heure de début et l'heure de fin (calculée à partir de la valeur de la construction).
Question : Comment faire pour faire en sorte qu'au moment où la date actuelle atteint la date de fin de construction, que l'amélioration soit effectivement construite ? (Ce qui correspond à une insertion dans la base de données).
En effet, ça ressemble à de la programmation événementielle, mais basée sur la base de données, donc ça me paraît compliqué :/
J'ai trouvé deux workarounds :
- Quand le joueur est connecté, à chaque fois qu'il effectue une requête, j'utilise un hook de Symfony2 qui exécutera la fonction de mise à jour.
- Quand le joueur est déconnecté, j'ai un cron qui est appelé toutes les minutes (valeur à définir, en fonction de la charge que ça a sur le serveur), et qui met à jour les constructions terminées.
Mais comme je le dis, ce ne sont que des workarounds, qui fonctionneront relativement bien (et encore, tout dépend de la charge que ça aura sur le serveur).
Est-ce que quelqu'un aurait une idée de comment gérer ça de façon propre, et/ou d'améliorer la façon dont j'envisage les choses ? C'est un système qui existe dans à peu près tous les jeux en ligne, donc vous savez peut-être comment c'est géré.
Merci d'avance de votre aide