02-07-2013, 09:19 AM
Salut,
La solution est simple: declencher l'execution du script au moment ou le combat a lieu. Que se soit par un evenement one shot quelconque (par exemple un cron "temporaire") ou un polleur (un cron qui va regarder tous les X unites de temps s'il y a un truc a faire (unite a definir en fonction de la precision que tu veux)).
Je me suis retrouve face au meme probleme que toi il y a peu.
J'ai teste un peu le cron, mais pour moi ca se "rapproche" trop du systeme (le php a mon sens ne doit pas intervenir sur le systeme dans le cadre d'une application web comme ca).
J'ai teste avec du NodeJS (champion de la gestion de la concurrence du moment) ou mon Node servait de poller et interrogeait la BDD toutes les 5 secondes (puis toutes les secondes pour voir) pour savoir s'il y avait quelque chose a faire et le cas echeant le faisait. Mais j'aime pas le principe de "Je tourne en permanence pour rien".
J'ai choisi de tout mettre dans MySQL (qui dispose d'un event scheduler). Je declenche donc l'execution d'une procedure stockee a l'exact moment du timestamp. L'inconvenient c'est qu'il n'y a pas de moyen simple et secure d'executer autre chose que du SQL (il existe un petit module qui permet de faire des appels externes mais c'est pas secure, et un petit module qui permet de faire du Curl like mais c'est pas simple !) du coup il a fallut tout (re)ecrire en SQL plutot que PHP ... Y compris les mises a jours diverses et variees. L'avantage, tu as toutes les donnees sous la main vu que ta BDD est censee etre garante de celles-ci et c'est decorrele du PHP donc pas de temps d'attente du joueur. Comme tu declenche le tout au moment du timestamp, normalement tu as une vision instantanee valide de l'etat de tout (resources, flottes en vol, constructions en cours...).
C'est en tout cas la solution qui se rapproche le plus du temps reel que j'ai trouve ET qui m'a plu.
/!\ Attention, cette solution requiere d'avoir beaucoup de controle sur ton serveur, au moins un VPS serai donc necessaire.
Alternativement, tu pourrais mixer nos differentes propositions:
A l'instant indique par le timestamp faire une sorte de snapshot des donnees dont tu as besoin, puis les traiter en asynchrone a la prochaine action utilisateur. C'est un poil moins "temps reel" mais tu peux toujours travailler sur des donnees exactes. Ca devrait simplifier les procedures SQL si celles-ci te font peur !
La solution est simple: declencher l'execution du script au moment ou le combat a lieu. Que se soit par un evenement one shot quelconque (par exemple un cron "temporaire") ou un polleur (un cron qui va regarder tous les X unites de temps s'il y a un truc a faire (unite a definir en fonction de la precision que tu veux)).
Je me suis retrouve face au meme probleme que toi il y a peu.
J'ai teste un peu le cron, mais pour moi ca se "rapproche" trop du systeme (le php a mon sens ne doit pas intervenir sur le systeme dans le cadre d'une application web comme ca).
J'ai teste avec du NodeJS (champion de la gestion de la concurrence du moment) ou mon Node servait de poller et interrogeait la BDD toutes les 5 secondes (puis toutes les secondes pour voir) pour savoir s'il y avait quelque chose a faire et le cas echeant le faisait. Mais j'aime pas le principe de "Je tourne en permanence pour rien".
J'ai choisi de tout mettre dans MySQL (qui dispose d'un event scheduler). Je declenche donc l'execution d'une procedure stockee a l'exact moment du timestamp. L'inconvenient c'est qu'il n'y a pas de moyen simple et secure d'executer autre chose que du SQL (il existe un petit module qui permet de faire des appels externes mais c'est pas secure, et un petit module qui permet de faire du Curl like mais c'est pas simple !) du coup il a fallut tout (re)ecrire en SQL plutot que PHP ... Y compris les mises a jours diverses et variees. L'avantage, tu as toutes les donnees sous la main vu que ta BDD est censee etre garante de celles-ci et c'est decorrele du PHP donc pas de temps d'attente du joueur. Comme tu declenche le tout au moment du timestamp, normalement tu as une vision instantanee valide de l'etat de tout (resources, flottes en vol, constructions en cours...).
C'est en tout cas la solution qui se rapproche le plus du temps reel que j'ai trouve ET qui m'a plu.
/!\ Attention, cette solution requiere d'avoir beaucoup de controle sur ton serveur, au moins un VPS serai donc necessaire.
Alternativement, tu pourrais mixer nos differentes propositions:
A l'instant indique par le timestamp faire une sorte de snapshot des donnees dont tu as besoin, puis les traiter en asynchrone a la prochaine action utilisateur. C'est un poil moins "temps reel" mais tu peux toujours travailler sur des donnees exactes. Ca devrait simplifier les procedures SQL si celles-ci te font peur !