JeuWeb - Crée ton jeu par navigateur
Lancer des script type Cron, manuellement - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Lancer des script type Cron, manuellement (/showthread.php?tid=2232)

Pages : 1 2


Lancer des script type Cron, manuellement - Kassak - 02-01-2008

Bonjour bonjour !

Jusqu'à aujourd'hui, j'utilisais un service Cron disponible sur le web ( celui de nainwak ), qui me permettait de lancer divers script, comme la distribution de pa/pm, l'augmentation de la faim, la distribution de l'or etc....

J'avais utilisé cela au début du projet, car je ne savais pas comment faire autrement, mais maintenant que je sais le faire facilement, je vais quitter ce système, et faire les script moi même, en jouant avec les timestamp.

Bref, mon problème ne vient pas de la ( enfin j'espère que j'en aurais pas^^), je me demandais où placer tous ces scripts sur mon site.

Le seul endroit que je trouve approprié est mon header, comme ça a chaque click, le script va chercher si il doit se lancer ou pas.

Mais ça doit bouffer beaucoup de ressources? Si il doit faire 10,15 ou 20 vérifications à chaque fois? Surtout que se sera lancé en même temps que les déplacements et tout le reste...bref pas top moumoute!

Et autre question, si un script se lance toutes les heures, et que personne ne click pendant 2 heures, ba les joueurs se font entuber xD


Bref, j'aimerais avoir quelques explications sur ce système, comment le gérer, etc...

Merci Smile


RE: Lancer des script type Cron, manuellement - alfanor - 02-01-2008

Euh je trouve ton raisonnement bizarre, en général on passe du système que tu veux mettre en place au système de cron et pas l'inverse. Ce que tu veux faire fera exactement la même chose, sauf que ça va te bouffer des ressources inutilement (certes peu, mais si on peut éviter si ce n'est qu'une condition, autant le faire).

Donc après si tu veux absolument arrêter les crons pour je ne sais quelle raison (la seul raison évidente que je vois étant qu'en général les services gratuit lance une fois sur trois le cron), il te suffit comme tu l'as dit d'inclure ton fichier "cron.php" dans ton header afin que soit vérifié à chaque fois le timestamp pour savoir s'il faut ou non mettre à jour.

Pour ton problème de X heures, il suffit d'écrire quelque part le timestamp de la dernière mise à jour (BDD, fichier par exemple) et de multiplier les ressources gagné (et autres) par ce nombre d'heures X écoulée depuis la dernière mise à jour.

Enfin personnellement je te conseil de rester avec les crons mais si possible en ayant un hébergement payant qui les permet, avec 1and1 j'ai ça et en quatre mois j'ai 2 tours qui ont sauté. (c'est assez bizarre en fait, à chaque fois qu'ils ont sauté c'est quand j'exécutais une page pile au changement d'heure, enfin au moins je les lançais à la main aussitôt quoi ...)


RE: Lancer des script type Cron, manuellement - Kassak - 02-01-2008

Ben en faites, la dernière fois que j'ai dit que je me servait encore des Crons, on m'a dit que c'était bidon, et qu'il fallait mieux que je fasse ça de moi même, avec un script qui vient de moi, et qui se lance a partir de mon site et pas d'un autre truc.

Mais bon, je préfère vous écouter vous, c'est vrai qu'avec un système de Cron d'un hébergeur payant, style OVH, il ne devrait pas y avoir de souci, et si vous dites que c'est plus efficace de s'en servir, je vous crois Smile

J'avais en faites une mauvaise opinion des Crons, car chez nainwak ( je ne dit pas que leur service est pourri loin de la !), c'est pas 2 fois en 4 mois qu'un tour saute...!

Enfin, je vais quand même attendre d'autre avis, c'est peut être pas un grand débat, mais c'est quand même un point important du jeu tout ça !


Edit : voici un ancien post que j'avais fait a mes débuts qui reprend ce sujet ( je l'avais oublié ): http://www.jeuweb.org/board/showthread.php?tid=1519


RE: Lancer des script type Cron, manuellement - naholyr - 02-01-2008

Il ne faut faire ces taches que lorsqu'on est sûr d'en avoir besoin, et n'effectuer que les opérations qui concernent directement ou indirectement le joueur connecté.

Par exemple au moment où il se connecte tu vas recalculer sa jauge de faim, car c'est un élément qui doit être à jour instantanément.
En revanche si sa réserve de blé n'est pas affichée en page d'accueil, il ne faut faire la mise à jour que lorsque son affichage est réclamé.

L'inconvénient de cette pratique, c'est que les classements sont soit pas à jour, soit très lourds à calculer (puisqu'il faut faire toutes les mises à jour de tout le monde avant d'afficher le classement).

Que personne ne la réclame pendant 3 jours ou qu'on la réclame toutes les 3 secondes ne doit avoir aucun impact ! sinon tu peux être sûr que tout ton jeu ne sera qu'une grosse faille béante demandant à être exploité.

Un exemple : un joueur gagne 1 épi de blé toutes les heures pleines (60 minutes).
J'ai stocké quelque part (mettons dans une table "updates", qui aurait 3 champs : user_id, quoi, quand) la date de dernière mise à jour du stock d'épis de blé, date_maj = 31/12/2007 02:51:34 (timestamp = 1199065894)
date_maintenant = 02/01/2008 15:31:47 (timestamp = 1199284307)
Différence des timestamps = 1199284307 - 1199065894 = 218413 secondes
Nombre d'heures pleines écoulées = floor(218413/3600) = 60, restent 218413 % 3600 = 2413 secondes.

- Depuis la dernière mise à jour, le joueur a gagné 60 épis de blé (60 heures pleines écoulés), qu'on ajoute dans la base de données
- On stocke la nouvelle date de dernière mise à jour : maintenant ? Raté !! C'est là l'erreur, car en faisant ça on sucre 2413 secondes, et le joueur ne gagnera son épi que dans une heure complète au lieu de 20 minutes ! La nouvelle date de dernière mise à jour est donc date_maintenant - 2413 Smile

Et là, aucun bug Wink

Si je résume, pour un évènement indépendant du contexte (s'il dépend d'un élément tiers comme la météo, la santé, etc... on est obligé de passer par un vrai cron) régulier survenant toutes les X secondes :
- Exécuter l'évènement N fois, N = arrondi_inférieur((date_maintenant - date_derniere_mise_a_jour) / X)
- Stocker date_derniere_mise_a_jour = date_maintenant - ((date_maintenant - date_derniere_mise_a_jour) % X)


RE: Lancer des script type Cron, manuellement - Zamentur - 02-01-2008

oxman a écrit :Il n'y a pas mieux que les cron, tu vas au devant d'ennui et de problème.
Un problème que tu as déjà relevé, si personne click pendant 2h.

Et l'autre, si ton script est un peu long, la personne qui aura validé l'action qui charge ton script va croire que le site est lent, alors que c'est parce qu'il a déclenché un évènement spécial.
Ca c'est faux...
si personne ne clique pendant 2h rien n'empeche de dire au script de s'executer 2 fois de suite avec une petite boucle (ou d'optimiser mieux et de faire un script qui le prenne vraiment en compte)

Et j'avais posté une technique utilisant la redirection via header() qui expliqué que si on met du code aprés le header('location: ...'); celui ci sera executé sans que l'utilisateur s'en apercoive comme ci c'était un cron.
Le seul inconveniant c'est qu'effectivement le script ainsi lancé est lancé par le premier utilisateur arrivant sur le site aprés l'heure dite...
Donc avec peu de joueur les mise à jour ne seront pas faite à l'heure exact, mais çà personne ne s'en rendra compte puisque personne ne se sera encore connecté et que le premier arrivé aurra due afficher la page d'identification se qui laisseras tout le temps de faire les calculs necessaire (pour un faible nombre de joueur)
Avec beaucoup de joueur il n'y aurra vraiment plus de difference (puisque je le rappel avec ce systeme on ne vois pas de lenteur de chargement puisqu'on ne vois pas le script s'executer).

L'avantage etant qu'on est independant d'un cron et donc soit d'un service externe soit d'un type de configuration...

Donc moi je ferais çà comme çà:
Code PHP :
<?php
//prérequis (dont demarage session)

//si il y a au moins un script à lancé (çà peut etre une condition en fonction de l'heure par exemple)
if ($script>0) {
//on enregistre les superglobal utilisateurs en SESSIOn ou en chaine GET (oui car on pourra pas recuperer les variable POST comme çà malheureusement) là je le fais en session
$_SESSION['_POST']=$_POST;
//on redirige vers la meme page qui s'occuperas de faire les actions utilisateur et l'affichage
header('location: http://www.trucs.bd/cette_page.php?p=5');

//Execution des scripts habituelement lancé avec le cron

//On arrete le script (puisque le header est inclue pas besoin de faire les operation suivante puisqu'on a déjà était redirigé!)
exit;
}

//Ici on recupere eventuelement les données de POST
if (isset($_SESSION['_POST'])) {
$_POST=$_SESSION['_POST'];
unset(
$_SESSION['_POST']);
}

//Suite de header
?>

A noter que çà utilise le fait qu'une page fermé (en l'occurence redirigé) avant la fin de son execution termine tout de meme son execution, et ainsi nous permet de faire ce petit script...


RE: Lancer des script type Cron, manuellement - alfanor - 02-01-2008

Oui mais là tu t'embêtes à faire bosser le serveur pour rien quoi, tu affectes des variables, tu réaffectes à nouveau alors que le cron fait directement le boulot sans t'ennuyer, sans une seul ligne de code supplémentaire ... C'est se compliquer la vie pour rien là je trouve.

ps : En même temps pour les variables ne connaissant pas le fonctionnement interne de PHP (donc du moteur en C), je ne sais pas s'il ne s'agit pas juste d'un pointeur et non d'une copie, si c'est juste un pointeur là encore ça va (mais ça fait toujours du code supplémentaire pour rien Tongue )


RE: Lancer des script type Cron, manuellement - oxman - 19-01-2008

Les cron c'est ultra naze.
Faut coder tout un système soit même.
Les cron c'est naze, on aura leur peau.
Tous en coeur !


RE: Lancer des script type Cron, manuellement - Harparine - 19-01-2008

oxman a écrit :Les cron c'est ultra naze.
Faut coder tout un système soit même.
Les cron c'est naze, on aura leur peau.
Tous en coeur !

Une bibliothèque de briques est disponibles, ainsi qu'une section de tutoriaux. Tu peux y proposer ta contribution sur les cron...


RE: Lancer des script type Cron, manuellement - oxman - 19-01-2008

Je vais pas proposer un truc naze :'(


RE: Lancer des script type Cron, manuellement - Harparine - 19-01-2008

Et pourquoi pas ton système-de-la-mort-qui-tue-qui-déchire-tout que tous les incapables peuplant ce forum sont incapables de coder car ils n'ont pas ton immense savoir ?

Peut-être que là, tu serais enfin constructif...