Incrémentation automatique (hors ligne) ?
- Accueil
- Forum
- Programmation
- SQL
- Incrémentation automatique (hors ligne) ?
nsDiZ Le 27 avril 2016 à 19:59 (Édité le 25 janvier 2019 à 17:50)
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 Le 27 avril 2016 à 21:36 (Édité le 1 janvier 1970 à 01:00)
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 Le 27 avril 2016 à 22:09 (Édité le 1 janvier 1970 à 01:00)
tu as juste a prendre la date actuel et celle de l'inscription faire une soustraction et multiplier selon le gradeMalheureusement 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 Le 28 avril 2016 à 02:25 (Édité le 1 janvier 1970 à 01:00)
TheOldNoob Le 28 avril 2016 à 08:23 (Édité le 1 janvier 1970 à 01:00)
Si tu a un Sheldon Cooper dans tes ami, tu va peut-être pouvoir t'en sortir... 😉
nsDiZ Le 28 avril 2016 à 19:22 (Édité le 28 avril 2016 à 20:47)
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 Le 12 mai 2016 à 20:09 (Édité le 12 mai 2016 à 20:12)
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 Le 12 mai 2016 à 20:34 (Édité le 1 janvier 1970 à 01:00)
Florian Le 12 mai 2016 à 21:43 (Édité le 1 janvier 1970 à 01:00)