Lancement de tâches cron automatiques depuis PHP

Lancement de tâches cron automatiques depuis PHP - PHP - Programmation

Marsh Posté le 18-07-2012 à 17:53:24    

Bonjour à tous,
 
Je poste un message sur ce forum car après maintes recherches sur le web, je ne trouve pas la solution à mon problème.
D'habitude je ne suis pas du genre à poster des messages à tout va, je trouve habituellement ce que je cherche.
 
Mais dans ce cas précis, je m'avoue vaincu. C'est d'autant plus bizarre parce que j'ai déjà vu ce genre de compteurs dans plein de jeux.
J'explique mon problème : je dois développer un jeu en ligne avec des timers de partout, c'est-à-dire que chaque joueur va voir se réinitialiser ses objets toutes les X heures (avec un compteur qui tourne devant ses yeux, qui remet à jour la page à la fin, et si il n'est pas connecté, le traitement se fait quand même).
 
Pour le compteur qui tourne, je l'ai implémenté en jquery, maintenant le gros souci c'est comment faire pour programmer les tâches cron pour chaque joueur, à la seconde près (sachant que les cron ne fonctionnent pas avec des secondes, et qu'elles sont parfois limitées en nombre de lignes, ou parfois il faut être en root pour les modifier...), en synchronisant le compteur jquery arrivé à 00:00:00 avec la tâche cron...  :pt1cable:  
 
Peut-être qu'il faut que je m'oriente vers un script de file d'attente qui tourne en permanence, je n'en sais rien. Si vous avez une idée, je vous en remercie d'avance!

Reply

Marsh Posté le 18-07-2012 à 17:53:24   

Reply

Marsh Posté le 18-07-2012 à 23:21:38    

Pour moi la réponse est : impossible !
 
La seule solution est de tout calculer dès que le joueurs se connecte.
 
Apres tu peux t'amuser a lancer des cron en php mais ca necessite d'etre root, et je le conseillerai pas trop pour un jeu.


Message édité par GordonF_69 le 18-07-2012 à 23:24:39
Reply

Marsh Posté le 19-07-2012 à 00:33:57    

Comment ça impossible? j'en doute fortement, vu que ça existe sur beaucoup de jeux et depuis très longtemps...
J'ai trouvé ce topic qui traite du même sujet sur un forum spécialisé dans les jeux par navigateur : http://www.jeuweb.org/showthread.php?tid=8524
Il donne une solution soit avec une tâche cron qui tourne toutes les minutes sur le serveur et qui gère les process de la queue (ça me semble lourd comme traitements), soit avec les librairies PHP Resque et PHP Resque Scheduler. Qu'en penses tu?
 
Donc pour toi si le joueur ne se connecte jamais, ses éléments ne sont jamais réinitialisés... c'est pas bête du tout comme réflexion, je n'y avais pas pensé, je vais y réfléchir la nuit porte conseil. En tout cas merci beaucoup!

Reply

Marsh Posté le 19-07-2012 à 09:35:52    

Tu fais une table de jobs, un job pour chaque joueur avec une date/heure (soit celle de connexion, soit celle à laquelle la tâche devra être exécutée, cette 2ème option étant probablement la plus simple) et d'autres champs correspondant aux paramètres de la tâche à exécuter.
 
Dans le cron, tu ne mets qu'une seule ligne :
* * * * * * php -q /CheminDuScript/Cron.php
 
Ce script aura pour travail de regarder dans la BD s'il y a des tâches correspondant à la date et heure courante (ou date/heure courante + x heures si t'as choisi de mettre dans la BD la date/heure de connexion). S'il en trouve, pour chacune d'entre elle, il fait le traitement.
 
Par contre, le cron, ça fréquence min semble être la minute et non la seconde.
 
Autre solution, en ajax. Quand le compteur du joueur arrive à 0, il appelle un script php qui exécute la tâche que tu veux. Là, tu seras à la seconde près (encore que ça va dépendre de la charge de ton serveur, s'il y a beaucoup de monde, pas dit que ça tienne)...
 
Edit : pour la question des joueurs non connectés, il suffit d'avoir la date de leur dernière action et de les traiter par le script Cron.php évoqué précédemment et de sélectionner tous les joueurs qui ont une certaine date de dernière action et de mettre à jour leurs données associées.

Message cité 1 fois
Message édité par rufo le 19-07-2012 à 09:39:10

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 19-07-2012 à 10:12:47    

rufo a écrit :


Autre solution, en ajax. Quand le compteur du joueur arrive à 0, il appelle un script php qui exécute la tâche que tu veux. Là, tu seras à la seconde près (encore que ça va dépendre de la charge de ton serveur, s'il y a beaucoup de monde, pas dit que ça tienne)...


Vu que l'ajax sera déclenché par javascript coté client, il prendra l'heure du PC client, comment ça se passe pour la gestion des fuseaux horaires ? Et le changement d'heure en octobre si des gens jouent à 3h du mat' ?


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 19-07-2012 à 11:21:36    

Je parlais bien d'un compteur en secondes initialisé par le serveur. Quand il arrive à 0, appel ajax. Donc pas de pb côté horaire client ou changement d'horaire été/hiver ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 19-07-2012 à 12:02:03    

La commande at me semble un peu plus indiquée que le cron dans ce cas. Je viens de regarder, et apaprement l'option -t permet de donner une heure précise à la seconde (pas testé par contre). Extraits du man :
 
 at [-V] [-q queue] [-f file] [-mldrbvt] TIME
-t time_arg
             Specify  the time to run in a format compatible with
             the touch -t time command.
 
 
Sinon tu peux éventuellement coder un petit daemon.

Reply

Marsh Posté le 19-07-2012 à 12:20:51    

Je penche plutôt pour la solution en ajax pour mettre à jour les éléments du joueur dès que le compteur arrive à 0 en mode connecté, et en mode  non connecté rien ne se passe, jusqu'à sa prochaine connexion où le travail se fera à ce moment là (1 requête sql).
 
Si j'avais envie de passer par le cron déclenché toutes les minutes sur mon dédié, mon souci avec cette solution c'est :
- est-ce qu'avec une tâche cron qui se lance toutes les minutes sur le serveur, ca ne va pas le surcharger si il y a 500 joueurs a updater dans la minute?
- et si il y a 2000 joueurs qui sont connectés en même temps, cela risque aussi de ralentir le serveur, et de causer des lenteurs d'affichage des pages pour les joueurs?
- j'imagine que dans ce cron, on va tester chaque seconde si dans la table des process il y a quelque chose à faire. si dans la seconde il y a 200 process à faire (par exemple), je doute que ces X tâches puissent être faites en 1 seule seconde, et dans ce cas si le joueur est connecté et que son compteur arrive à 0, j'ai bien peur que le cron ne soit pas synchronisé parfaitement avec la page du joueur, et là ca devient problématique...  :cry:
 
En tout cas merci à tous pour vos réponses, ça m'aide énormément.

Reply

Marsh Posté le 19-07-2012 à 14:19:50    

Nukolau a écrit :

La commande at me semble un peu plus indiquée que le cron dans ce cas. Je viens de regarder, et apaprement l'option -t permet de donner une heure précise à la seconde (pas testé par contre). Extraits du man :
 
 at [-V] [-q queue] [-f file] [-mldrbvt] TIME
-t time_arg
             Specify  the time to run in a format compatible with
             the touch -t time command.
 
 
Sinon tu peux éventuellement coder un petit daemon.


 
Marrant, j'étais persuadé que at, sous windows, était l'équivalent de cron... Y'aurait donc une commande at sous Linux ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 19-07-2012 à 17:22:43    

oui et extrêmement pratique qui plus est ;)
 
D'ailleurs ce n'est pas que sur linux, mais aussi sur les unix (du moins AIX / HP-UX / Solaris), donc je pense que c'est assez ancien.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed