IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Jeux par navigateur points actions


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Homme Profil pro
    IBM Application Development Programmer Specialist
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : IBM Application Development Programmer Specialist

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Jeux par navigateur points actions
    Re-Bonjour à tous
    Je fait suite à un problème rencontré pendant le développement d'un jeux navigateur.
    Il s'agit du système de points d'action, Pour ceux qui ne connaissent pas ce système :
    chaque joueurs aurais par exemple 10 Points d'actions. Chaque actions coûte 1 PA (se soigner, combattre,s'entrainer,etc..), et les PA s'incrémentent de 1 à chaques heures. Jusque la pas de souci, pour faire cela, une simple query :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO ma_table_de_stat ('PA') VALUE (PA+1)
    avec une condition bien sur pour incrementer les user qui n'ont pas le maximum de PA (ce qui evite d'avoir 11/10 PA )

    la requête fonctionne, le problème c'est à l'appel du script,
    pour le faire periodiquement ... bien sûr, l'accès à crontab m'est interdit par mon hébergeur (ce seras trop facile sinon )

    j'ai donc fait un script php qui execute cette query et qui est appell par un cron externe (SetCronJob)
    Seulement si quelqu'un lance cette page php il peut lancer cette query :/ ==> grosse faille de sécurité

    voici le code du "script" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
     
    include 'db.php';
     
    $query = sprintf("UPDATE `haishin_fr`.`entity_stats` SET `value` = `value`+1 WHERE `entity_stats`.`entity_type` = 'User' And `entity_stats`.`stat_id` = '16' And `value` < 10");
    $result = mysql_query($query);
    ?>
    Connaissez vous un autre moyen de lancer periodiquement cette query ?

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 327
    Points : 15 670
    Points
    15 670
    Par défaut
    une possibilité serait d'enregistrer la date de dernière mise à jour des PA et de réaliser la mise à jour en fonction de cette date

  3. #3
    Membre à l'essai
    Homme Profil pro
    IBM Application Development Programmer Specialist
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : IBM Application Development Programmer Specialist

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Oui mais alors il faudrait que le script : 'check' si date de derniere MAJ > 1h Alors MAJ Sinon Rien.
    Ce qui implique un script qui tourne en permanence, est ce possible ?
    je connais deja la réponse : oui avec un while(1) .. mais est ce que ça ne vas pas surcharger le serveur pour pas grand chose ?

    EDIT : Après quelques recherche sur ton conseil, et quelques réflexions, est ce correct (correcte dans le sens propre et pas trop "code bazarre" ) si je fait mon script comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while(1){
    //Check last_MAJ
    //if Current_Time - Last_MAJ >= 1 Then MAJ()
    //else Rien
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(1){
    // MAJ()
    sleep(3600)
    }
    Quel structure est la plus perfomante, propre et efficace d'apres vous ?
    Et dans le cas du second code, que ce passerait-il si un utilisateurs lambda lance le script ? idem pour le premier, le script ne tournerait pas 2 fois en parallele ? ou une seule fois ?

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 327
    Points : 15 670
    Points
    15 670
    Par défaut
    le code de ton script se résumera plutôt à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //if Current_Time - Last_MAJ >= 1 Then MAJ()
    //else Rien
    ensuite tu peux appeler ce script toutes les 30 minutes ou toutes les heures avec SetCronJob

    quelques améliorations possibles ensuite :
    - prévoir dans la fonction MAJ() le cas où plusieurs heures sont passées depuis le dernier ajout de points
    - SetCronJob avec le compte gratuit permet seulement l'appel d'une commande toutes les 30 minutes donc ce script pourra s'occuper de faire la mise à jour de plusieurs paramètres si le jeu le nécessite

  5. #5
    Membre à l'essai
    Homme Profil pro
    IBM Application Development Programmer Specialist
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : IBM Application Development Programmer Specialist

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Je vois merci de ton aide,
    je n'ai pas eu le temps d'implementer ça pour le moment et je ne pense pas pouvoir avant demain,
    je garde donc ce topic ouvert en attendant mais te remerci de tes réponses/conseils avec le pouce vert

  6. #6
    Membre habitué Avatar de GalliezB
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2013
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 89
    Points : 162
    Points
    162
    Par défaut
    Salut,

    Étant aussi amateur dans le développement de jeux web, je te permet d'exposer ce que j'en sais aujourd'hui. C'est un point qui est souvent discuté sur des forum spécialisé comme http://www.jeuweb.org/ que je te conseil en complément de ce forum. Tu y trouvera pas mal de débat sur bon nombre de concept similaire à beaucoup de jeux web.

    Voici les solutions mises en place pour différents jeux que j'ai fait :


    La tâche cron qui toutes les X minutes va mettre à jours la BDD

    L'inconvénient étant que même à 1 minute d'intervalle, si ton joueur sait précisément quand il doit recevoir son PA, il existe un décalage pouvant atteindre 59 sec.

    L'inclusion d'un script pour chaque joueur
    A chaque fois que le joueur change de page, ou rafraichi sa page, un script est appelé et mets à jours le nombre de PA. Ce script est évidemment appelé lors de la connexion au jeu pour permettre de rajouter les X pas nécessaire depuis sa dernière connexion.
    L'inconvénient majeur de cette solution est que le script est appelé à chaque page. J'ai donc mis le timestamp en cookie, et je n’appelle ce script que si le cookie n'existe pas, ou que la différence entre le cookie et le timestamp courant dépasse 1H. Le script recrée le cookie pour éviter des requêtes ultérieures inutiles. Ça marche aussi avec une session.
    Le 2e inconvénient est que si ton jeu permet à un joueur de voler ou supprimer des PA d'un adversaire par exemple, et que celui-ci est déconnecté, il y aura un soucis de mise à jours des PA de la cible s'il n'est pas connecté depuis peu. Il faudra donc penser à mettre les PA de la cible à jour durant l'attaque par exemple.

    Ces script étant inclus dans d'autres appelle de script, il te suffit de les mettre dans un dossier et de refuser leur appelle en direct. ( Je faisait cela avec les Vhost sur un dédié, ça doit être possible avec les .htaccess )
    Niveau sécurité, ne t'en fais pas de trop, si t'es amateur, il sera difficile pour quelqu'un de savoir ou tu as rangé le script en question. Car nous nommons souvent nos répertoire de façon moins standard Puis si quelqu'un le trouve, le script mettant la BDD à jour selon une session ID par exemple, il suffirait de vérifier la présence de la session.

    En tout cas, malgré le nombre de bot impressionnant que mon serveur ban, ils tentent de trouver toujours les même répertoires : admin, admins, template etc... Bref toute l'arborescence des framework ou CMS les plus connus.
    Imagine créer un répertoire genre "repSuperMegaSafe" ( oui oui j'arrache la ), a moins de l'appeler en ajax par exemple, je ne vois pas comment qui que ce soit pourrai trouver le nom d'un tel répertoire

    En production pense à désactiver l'affichage des erreurs PHP, et personne ne pourra jamais rien savoir, même en cas de bug. Je fait cela depuis des années, et ça tourne nickel.

  7. #7
    Membre à l'essai
    Homme Profil pro
    IBM Application Development Programmer Specialist
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : IBM Application Development Programmer Specialist

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    @mathieu -> Merci de ton aide, ta solution fonctionne parfaitement
    @GalliezB -> Merci de tes conseil+aide supplémentaire et merci aussi pour la communauté que tu m'as fait découvrir
    Je pense implémenter la deusième solution que tu propose, et pour ce qui est des noms de répertoire je pense renomer certains dossiers "sensible" puisque pour l'instant j'ai un peut tout nommer comme les bases (css pour le css, function pour mes functions php, class pour mes classes, etc..)

    En tout cas merci de votre aide je peut maintenant poster ce topic en résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ Jeux par Navigateur] Stargate Expédition
    Par Stargate2013 dans le forum Jeux web
    Réponses: 5
    Dernier message: 25/10/2014, 19h45
  2. Jeux par navigateur tour par tour
    Par didawin dans le forum Langage
    Réponses: 7
    Dernier message: 24/04/2014, 18h47
  3. [Recrutement] [PHP] Jeux par navigateur
    Par Akhyra dans le forum Projets
    Réponses: 0
    Dernier message: 04/07/2009, 12h12
  4. AGame : Jeux par Navigateur
    Par wikipierre dans le forum Projets
    Réponses: 9
    Dernier message: 10/03/2007, 14h30
  5. One Piece: jeux par navigateur
    Par D.Luffy dans le forum Projets
    Réponses: 3
    Dernier message: 21/10/2006, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo