Incrémentation automatique (hors ligne) ?

nsDiZ

nsDiZ Le 27 avril 2016 à 19:59 (Édité le 25 janvier 2019 à 17:50)

Bonjour, je suis nouveau et j'ai regardé beaucoup de tutoriaux mais aucun n'a répondu à ma question.

Pour vous expliquer un peu le sens du titre de ce sujet:

Je souhaiterais que chaque utilisateur ait une variable (ses points d'exp par exemple) et que cette variable voit son chiffre augmenter (1 par seconde par exemple) même lorsque l'utilisateur n'est pas sur le site. Ensuite ce serait bien de décider de combien elle augmente par seconde, exemple : Les "membres" gagnent 1 d'exp par seconde, alors que les "chef" gagnent 10 exp par seconde. (Tout cela hors ligne :D)

Pour la première fonction (incrémentation automatique même hors ligne) je pense que cela doit être possible.
Mais pour la deuxième, il faudrait y ajouter du PHP (condition grade/gain d'exp) et je ne sais même pas si c'est réalisable 😤

Si une âme charitable pouvait m'aider ou voire juste m'éclairer sur le sujet ^^
Florian

Florian Le 27 avril 2016 à 21:36

Je connais pas ton code mais y'a moyen de faire ça facilement

Tu enregistre le timespan quand la personne est inscrite on est d'accord que le Timespan commence le 1 janvier 1970 si je dit pas de bêtise.

Si tu fait un echo de time() ça va te sortie le timespan a l'heure actuel soit le nombre de seconde entre maintenant et le 1/01/1970, donc tu as juste a prendre la date actuel et celle de l'inscription faire une soustraction et multiplier selon le grade, soit tu fait une tache cron chaque X minute soit tu update quand il se connect tu as plusieurs choix 
nsDiZ

nsDiZ Le 27 avril 2016 à 22:09

Merci de tes conseils, je vais me renseigner un peu plus sur les tâches CRON.

tu as juste a prendre la date actuel et celle de l'inscription faire une soustraction et multiplier selon le grade
Malheureusement ce n'est pas aussi simple, j'ai oublié de préciser que la variable ne faisait pas qu'augmenter (par exemple la personne a 1500exp, 1 heure plus tard elle peu en avoir 1000 car elle les a perdu alors qu'elle n'était pas connectée par exemple) donc si on multiplierait temps depuis inscription * coeff, ça donnerait quelque chose qui ne ferait qu'augmenter. De plus le grade pourrait changer (donc le coeff aussi).

L'hisoire de l'exp, les grades, c'est juste pour avoir un exemple.

Sinon sans exemple ça serait :

loop()
{
$i = $i + $gain;
delay(1000);
}
(Je sais c'est du c# mais fallait bien que j'illustre l'idée :D )
Après pour l'update de l'info il y a deux possibilités:
  • La variable est mis à jour chaque secondes (voir plus pour ne pas trop surcharger)
  • La variable est mis a jour lorsqu'un autre utilisateur interagit avec l'utilisateur en question.

Demain je me renseignerais un peu plus sur les tâches CRON 😉
Florian

Florian Le 28 avril 2016 à 02:25

Tu updates a chaque fois que la personne est appeler, ou alors a chaque fois qu'il change de page ou qu'il effectue une action sinon y'a ceci http://php.net/manual/fr/ev.examples.php ainsi que le JS mais risquer x) la tache cron me parait plus sécuriser est plus optimal 
TheOldNoob

TheOldNoob Le 28 avril 2016 à 08:23

Je viens de passer 30 minutes a essayé dete  pondre l'algorithme de base (sans parler de code) qui pourait calculer ça.

Si tu a un Sheldon Cooper dans tes ami, tu va peut-être pouvoir t'en sortir... 😉
nsDiZ

nsDiZ Le 28 avril 2016 à 19:22 (Édité le 28 avril 2016 à 20:47)

Florian merci de m'avoir dirigé vers CRON, je pense avoir trouvé une solution 😀

TheHoldNoob , malheureusement non 😄 mais j'ai peut-être une alternative.

Après plusieurs recherches j'ai su qu'une tâche CRON ne pouvait se refaire que toutes les minutes minimum, mais j'ai quand même trouvé une autre solution tout en utilisant la tâche CRON.

La tâche CRON se lancerait donc UNE seule fois (au démarrage du serveur/site).
while  true; do    
   // Exécuter le fichier incrementation_auto.php    
   sleep 5 // Attendre 5 secondes
done
Avec dans la page php une requête pour mettre à jour la colonne variable de chaque utilisateur selon son coefficient de gain/s :

<?php
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '');
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
$user_info = $bdd->query('SELECT * FROM membres');
while ($user = $user_info->fetch()) 
   {
      $newvalue = $user['variable'] + ($user['gain'] * 5) ;
        $value_update = $bdd->prepare("UPDATE membres SET variable = ? WHERE id = ?");
        $value_update->execute(array($newvalue, $user['id']));
   }
?>
(newvalue = variable + gain*5 car la page s'exécute toutes les 5 secondes, or le gain de base est pour chaque seconde)
Ce code n'est pas encore testé, il faut encore que je comprenne bien comment fonctionne une tâche CRON pour exécuter un fichier.

Si vous voyez une erreur dans le code n'hésitez pas à me le dire, je viens tout juste de le faire ^^

Après le problème étant que n'importe qui pourrait accéder à cette page et donc lancer la mise à jour des informations... Il faudrait donc que ce code PHP s'exécute seulement si le visiteur est CRON (bien sûr je ne sais pas encore si c'est possible 😄 ).

Par contre je me demande si : si il y a beaucoup de membres dans la base de données, est-ce que toutes les requêtes de mise à jour s'effectueraient dans le délai des 5 secondes ? Aussi je ne sais pas si un telle requête (affichage de toutes les variables + modification) créerait des surcharges sur le site/serveur si il y a 500 membres par exemple :-/


EDIT : après plusieurs modifications le code PHP fonctionne bien. Mais je n'arrive toujours pas à faire fonctionner la tâche CRON (j'ai pris un hébergement gratuit chez hostinger), je ne sais pas si cela vient du code CRON ou si la requête ne s'est pas encore effectuée.
Florian

Florian Le 12 mai 2016 à 20:09 (Édité le 12 mai 2016 à 20:12)

Oups je t'ai laisser a l'abandon :x 

Donc pour la tache cron normalement tu as ceci 
http://prntscr.com/b39q45

Mais comme tu l'as dit tout le monde pourra y acceder, donc tu as tout simplement a mettre ton code php ici http://prntscr.com/b39qpm personne pourra y acceder, seulement le serveur, mais la tache cron est exécuter par le serveur donc aucun problème il pourra faire ce qu'il veux, donc c'est sécuriser

Puis, je te déconseille de faire chaque secondes, ton serveur va tomber un moment, surtout que si la tache cron a pas fini que tu en relance une sur le même fichier la base de donnée va faire n'importe quoi, donc vos mieux faire petit a petit, exemple tout les pseudos qui commence de a-d 0-10Min d-g 10-20Min etc etc 
nsDiZ

nsDiZ Le 12 mai 2016 à 20:34

Ok merci de ta réponse, et merci du conseil pour sécuriser l'accès à la page 😀
Florian

Florian Le 12 mai 2016 à 21:43

Ou sinon combiner tache cron + effet utilisateur, en gros a chaque fois qu'il va sur une page ou autre, il update, mais je te conseille de créé un gens last_update et checker pour éviter qu'il y a la tache cron + l'utilisateur a toi de voir 😉
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte