31-07-2018, 03:12 PM
Salut,
tu parles de boucle infinie, mais on n'a ici que le début, donc, on ne pourra pas t'aider sur l'exact fix à utiliser.
Toutefois, le fix exact ne me semble pas intéressant du tout. En effet, là, t'es grosso-modo dans le cadre des tâches CRON à la seconde (cf https://toile.reinom.com/non-aux-taches-...a-seconde/ ). Tu dois repenser ton problème, pour ne pas concevoir les choses comme une "interrogation en continue de la BDD", mais comme "une réponse de la BDD dès qu'une condition est atteinte".
Pour ça, je vois plusieurs approches:
* T'as l'air parti sur du jeu très "temps réel", avec des actions multi-joueurs au sein de parties ponctuelles qui n'ont éventuellement pas besoin d'un serveur centralisé. Ca me semble plus adapté à du webRTC. A défaut, à de la stack node/JS et ses events à tout va.
* Si tu ne veux pas changer la techno sur laquelle tu pars (qui me semble peu adapté au besoin fixé), alors il te faudra forcément un temps d'attente dans ta boucle (sleep), de sorte que le client ou le PHP aille "pinger" la BDD régulièrement, jusqu'à avoir une place. Je pense que tu peux le faire avec un simple "sleep(1)", itéré disons 10x dans une page PHP dédiée. En début de page, tu inscris le joueur dans la BDD avec le moment d'inscription. En fin de page, ou quand le client se déconnecte, tu supprimes le joueur. Dans chaque itération de la boucle, tu cherches 6 joueurs dans la BDD dont l'inscription date de moins de 10 secondes. Côté client, quand le PHP a répondu favorablement et a trouvé des joueurs, tu "rejoins la partie" (à toi de définir comment c'est fait). Sinon, tu relances (en AJAX, car sinon dans une page classique, ce sera chiant pour l'UX) la requête, jusqu'à temps de trouver une place.
Mais bon, vu ce sur quoi tu pars en terme de techno face à ce que tu veux faire, et vu la façon dont tu as.... "préparé" la query SQL (elle est préparée, c'est sûr, mais elle n'est clairement pas paramétrisée et donc encore totalement ouverte à l'injection), je pense que tu n'auras pas le niveau pour réussir le type de jeu que tu envisages :/ Tu risques d'être déçu!
tu parles de boucle infinie, mais on n'a ici que le début, donc, on ne pourra pas t'aider sur l'exact fix à utiliser.
Toutefois, le fix exact ne me semble pas intéressant du tout. En effet, là, t'es grosso-modo dans le cadre des tâches CRON à la seconde (cf https://toile.reinom.com/non-aux-taches-...a-seconde/ ). Tu dois repenser ton problème, pour ne pas concevoir les choses comme une "interrogation en continue de la BDD", mais comme "une réponse de la BDD dès qu'une condition est atteinte".
Pour ça, je vois plusieurs approches:
* T'as l'air parti sur du jeu très "temps réel", avec des actions multi-joueurs au sein de parties ponctuelles qui n'ont éventuellement pas besoin d'un serveur centralisé. Ca me semble plus adapté à du webRTC. A défaut, à de la stack node/JS et ses events à tout va.
* Si tu ne veux pas changer la techno sur laquelle tu pars (qui me semble peu adapté au besoin fixé), alors il te faudra forcément un temps d'attente dans ta boucle (sleep), de sorte que le client ou le PHP aille "pinger" la BDD régulièrement, jusqu'à avoir une place. Je pense que tu peux le faire avec un simple "sleep(1)", itéré disons 10x dans une page PHP dédiée. En début de page, tu inscris le joueur dans la BDD avec le moment d'inscription. En fin de page, ou quand le client se déconnecte, tu supprimes le joueur. Dans chaque itération de la boucle, tu cherches 6 joueurs dans la BDD dont l'inscription date de moins de 10 secondes. Côté client, quand le PHP a répondu favorablement et a trouvé des joueurs, tu "rejoins la partie" (à toi de définir comment c'est fait). Sinon, tu relances (en AJAX, car sinon dans une page classique, ce sera chiant pour l'UX) la requête, jusqu'à temps de trouver une place.
Mais bon, vu ce sur quoi tu pars en terme de techno face à ce que tu veux faire, et vu la façon dont tu as.... "préparé" la query SQL (elle est préparée, c'est sûr, mais elle n'est clairement pas paramétrisée et donc encore totalement ouverte à l'injection), je pense que tu n'auras pas le niveau pour réussir le type de jeu que tu envisages :/ Tu risques d'être déçu!