De toute manière, le problème ne se pose pas, si tu fais bien les trucs.
C'est ainsi qu'il faut faire; le cron étant là seulement pour assurer que le monde ne se "fige" pas lorsque aucun joueur n'est connecté.
Ainsi, prenons l'exemple d'un wargame médiéval:
- Le "worker" dit manuel (à l'affichage des pages, donc quand le joueur est connecté) effectue les actions de la QUEUE spécifique au joueur lui-même (construction de bâtiments, création d'unités, mises à jour des ressources), mais également de celle des joueurs avec qui il est en interaction; si j'attaque un joueur lambda et que je remporte, il faut que ses ressources soit mises à jour pour savoir ce que je vais piller...
- Le "worker" dit automatique (ici ton cron) effectuera bien sûr les actions avec un léger décalage, mais ça ne pose pas de problèmes, puisque ça n'a d'impact sur rien. Et puis, qu'est-ce que le joueur en a à faire que son bâtiment ce soit terminé à 12:00:00 au lieu de 11:59:58, s'il n'était pas connecté? Strictement rien, en fait.
La meilleure des solutions restant bien sûr d'utiliser des vrai workers et des QUEUES, style Resque bien sûr ^^
oxman a écrit :Il n'y aura pas de lag, car tu ne dois pas te reposer sur la queue ou tout autre système que tu utilises. La queue sert à traiter les informations quand il n'y a personne de présent.
Si le joueur se connecte et va sur sa carte, tu dois checker à ce moment (quelque soit la solution utilisé, at, queue, ou autre) si les bâtiments sont finis ou non et aussi afficher le temps restant en le calculant à ce moment là. Si le bâtiment est finis bah tu affiches qu'il est terminé, donc le joueur ne le verra pas non terminé et tu vires de la queue le fait que le bâtiment était en construction.
De plus tu peux faire ça très simple, tu fais une classe ProcessQueuePlayer, et une classe ProcessQueue, le script qui tourne en cron toutes les 1mn va lancer la classe ProcessQueue pour traiter la queue, pour chaque ligne de joueur qu'elle trouve, elle fait ProcessQueuePlayer pour traiter la queue pour le joueur spécifique.
Du coup, quand le joueur se connecte sur le site, tu lances à chaque fois dans tes pages web la classe ProcessQueuePlayer qui ferait exactement le même traitement que le cron. Enfin à quelques détails près, comme le fait de ne pas envoyer de mail pour alerter de la fin de construction
C'est ainsi qu'il faut faire; le cron étant là seulement pour assurer que le monde ne se "fige" pas lorsque aucun joueur n'est connecté.
Ainsi, prenons l'exemple d'un wargame médiéval:
- Le "worker" dit manuel (à l'affichage des pages, donc quand le joueur est connecté) effectue les actions de la QUEUE spécifique au joueur lui-même (construction de bâtiments, création d'unités, mises à jour des ressources), mais également de celle des joueurs avec qui il est en interaction; si j'attaque un joueur lambda et que je remporte, il faut que ses ressources soit mises à jour pour savoir ce que je vais piller...
- Le "worker" dit automatique (ici ton cron) effectuera bien sûr les actions avec un léger décalage, mais ça ne pose pas de problèmes, puisque ça n'a d'impact sur rien. Et puis, qu'est-ce que le joueur en a à faire que son bâtiment ce soit terminé à 12:00:00 au lieu de 11:59:58, s'il n'était pas connecté? Strictement rien, en fait.
La meilleure des solutions restant bien sûr d'utiliser des vrai workers et des QUEUES, style Resque bien sûr ^^