Auteur Sujet: Cron  (Lu 8384 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne BadFurDay

  • Cerveau: OFF
  • Habitué
  • **
  • Messages: 224
    • NoBleme - forum et jeux en ligne
Re : Cron
« Réponse #15 le: 12 Avril 2006 à 18:01:03 »
Non, j'ai bati un cron, c'est a dire un ensemble de 4 pages en php qui me permettent de lancer un script automatiquement toutes les X minutes. Par exemple, dans un jeu en PHP nomme le NRM Online que je developpe, il y a une bourse dont les valeurs se mettent a jour toutes les 15 minutes sans que je touche a rien. Si ca c'est pas un cron...

Hors ligne Alx

  • Connaisseur
  • ***
  • Messages: 261
    • http://www.alliance-pbem.net
Re : Cron
« Réponse #16 le: 20 Avril 2006 à 09:16:37 »
Tu as du PHP qui tourne sur ton serveur en continue??

J'avoue que je ne vois pas comment tu fais??
Webmaster de Alliance-pbem, Jeu de rôle par e-mail dans l'univers Star Wars ™

www.alliance-pbem.net

Hors ligne BadFurDay

  • Cerveau: OFF
  • Habitué
  • **
  • Messages: 224
    • NoBleme - forum et jeux en ligne
Re : Cron
« Réponse #17 le: 20 Avril 2006 à 12:49:07 »
Si tu veux décortiquer un excellent cron, récupère le code d'une version de vBulletin récente (au moins v3.x), ils ont le meilleur cron que je connaisse à ce jour...
D'ailleurs, c'est la présence d'un cron intégré qui m'a motivé à prendre vBulletin plutôt qu'un autre [avec d'autres petits plus, évidemment]. Par la suite, j'ai refait un cron plus performant, mais le leur reste une référence!

Hors ligne Alx

  • Connaisseur
  • ***
  • Messages: 261
    • http://www.alliance-pbem.net
Re : Cron
« Réponse #18 le: 20 Avril 2006 à 13:11:25 »
Non mais, comment tu exécute une tâche à une heure donnée sans un prog qui tourne en tache de fond?
Webmaster de Alliance-pbem, Jeu de rôle par e-mail dans l'univers Star Wars ™

www.alliance-pbem.net

Hors ligne Just

  • Expert
  • ****
  • Messages: 924
    • AiN-IRC LE portail du 01 [Ain]!
Re : Cron
« Réponse #19 le: 20 Avril 2006 à 13:47:02 »
Bonjour,

J'avous que, comme Alx, je suis assez perplexe... à ma connaissance il est impossible que du PHP "se lance lui même" cad sans l'action d'un tiers qu'il soit humain ou robot. Il faut bien que quelqu'un face appel à une page pour éxécuter celà.
On sait que sur un site à très fort trafic on peu simuler des Crons en se basant sur le fait que le site sera visité au moins une fois toutes les X minutes et que donc toutes ses X minutes on peut lancer certaines tache de façon "automatisées"... avec le lourd désavantage de pénaliser le visiteur sur qui ça tombe :/.

Bref j'aimerais bien que tu nous explique ton système... je ne dis pas que c'est impossible, bien au contraire, mais je serais curieux de savoir comment cela marche :D.
Just OnMyOwn ... :B
"Be CoOl, KeEp CoOl, HaVe FuN!"
-
http://www.ain-irc.net/
http://www.funpart.net/

Hors ligne BadFurDay

  • Cerveau: OFF
  • Habitué
  • **
  • Messages: 224
    • NoBleme - forum et jeux en ligne
Re : Cron
« Réponse #20 le: 21 Avril 2006 à 02:26:04 »
Ben comme je dis, faut décortiquer le cron de quelqu'un...

Si vous voulez, envoyez moi un email à leuphorie@gmail.com et je vous envoie le coeur de mon cron

Hors ligne kevin

  • vip
  • Habitué
  • **
  • Messages: 228
Re : Re : Cron
« Réponse #21 le: 25 Avril 2006 à 12:55:16 »
Ben comme je dis, faut décortiquer le cron de quelqu'un...

Si vous voulez, envoyez moi un email à leuphorie@gmail.com et je vous envoie le coeur de mon cron

Tu pourrais en faire profiter tout le monde ici...

sinon pour ceux qui ne sont pas satisfaits de webcron il y a:
- http://www.cron.fr
- http://www.onlinecron.com
- ...
print map{chr(2.875*$_**4-32.25*$_**3+117.13*$_**2-142.75*$_+130)}(1..5)

Hors ligne BadFurDay

  • Cerveau: OFF
  • Habitué
  • **
  • Messages: 224
    • NoBleme - forum et jeux en ligne
Re : Cron
« Réponse #22 le: 25 Avril 2006 à 13:05:38 »
Oula, c'est vrai, j'avais complètement zappé l'histoire du cron!

Maintenant que mon FTP est réouvert, je vais vous montrer comment un cron fonctionne.
Ce cron-ci est celui de vBulletin, donc je ne peux pas le dévoiler en entier:

Tout d'abord:
if (!NOSHUTDOWNFUNC)
{
register_shutdown_function('exec_cron');
}
else
{
exec_cron();
}

Ensuite le cron lui-même:
// ###################### Start getnextrun #######################
// gets next run time today after $hour, $minute
// returns -1,-1 if not again today
function fetch_cron_next_run($crondata, $hour = -2, $minute = -2)
{
if ($hour == -2)
{
$hour = intval(date('H', TIMENOW));
}
if ($minute == -2)
{
$minute = intval(date('i', TIMENOW));
}

if ($crondata['hour'] == -1 AND $crondata['minute'] == -1)
{
$newdata['hour'] = $hour;
$newdata['minute'] = $minute + 1;
}
else if ($crondata['hour'] == -1 AND $crondata['minute'] != -1)
{
$newdata['hour'] = $hour;
if ($crondata['minute'] <= $minute)  {
$newdata['hour']++;
}
$newdata['minute'] = $crondata['minute'];
}
else if ($crondata['hour'] != -1 AND $crondata['minute'] == -1)
{
if ($crondata['hour'] < $hour)
{ // too late for today!
$newdata['hour'] = -1;
$newdata['minute'] = -1;
}
else if ($crondata['hour'] == $hour)
{ // this hour
$newdata['hour'] = $crondata['hour'];
$newdata['minute'] = $minute + 1;
}
else
{ // some time in future, so launch at 0th minute
$newdata['hour'] = $crondata['hour'];
$newdata['minute'] = 0;
}
}
else if ($crondata['hour'] != -1 AND $crondata['minute'] != -1)
{
if ($crondata['hour'] < $hour OR ($crondata['hour'] == $hour AND $crondata['minute'] <= $minute))
{
$newdata['hour'] = -1;
$newdata['minute'] = -1;
}
else
{
// all good!
$newdata['hour'] = $crondata['hour'];
$newdata['minute'] = $crondata['minute'];
}
}

return $newdata;
}

// ###################### Start updatecron #######################
// updates an entry in the cron table to determine the next run time
function build_cron_item($cronid, $crondata = '')
{
global $DB_site;

if (!is_array($crondata))
{
$crondata = $DB_site->query_first("
SELECT *
FROM " . TABLE_PREFIX . "cron
WHERE cronid = " . intval($cronid)
);
}

$minutenow = intval(date('i', TIMENOW));
$hournow = intval(date('H', TIMENOW));
$daynow = intval(date('d', TIMENOW));
$monthnow = intval(date('m', TIMENOW));
$yearnow = intval(date('Y', TIMENOW));
$weekdaynow = intval(date('w', TIMENOW));

// ok need to work out, date and time of 1st and 2nd next opportunities to run
if ($crondata['weekday'] == -1)
{ // any day of week:
if ($crondata['day'] == -1)
{ // any day of month:
$firstday = $daynow;
$secondday = $daynow + 1;
}
else
{ // specific day of month:
$firstday = $crondata['day'];
$secondday = $crondata['day'] + date('t', TIMENOW); // number of days this month
}
}
else
{ // specific day of week:
$firstday = $daynow + ($crondata['weekday'] - $weekdaynow + 1);
$secondday = $firstday + 7;
}

if ($firstday < $daynow)
{
$firstday = $secondday;
}

if ($firstday == $daynow)
{ // next run is due today?
$todaytime = fetch_cron_next_run($crondata); // see if possible to run again today
if ($todaytime['hour'] == -1 AND $todaytime['minute'] == -1)
{
// can't run today
$crondata['day'] = $secondday;

$newtime = fetch_cron_next_run($crondata, 0, -1);
$crondata['hour'] = $newtime['hour'];
$crondata['minute'] = $newtime['minute'];
}
else
{
$crondata['day'] = $firstday;
$crondata['hour'] = $todaytime['hour'];
$crondata['minute'] = $todaytime['minute'];
}
}
else
{
$crondata['day'] = $firstday;

$newtime = fetch_cron_next_run($crondata, 0, -1); // work out first run time that day
$crondata['hour'] = $newtime['hour'];
$crondata['minute'] = $newtime['minute'];
}

$nextrun = mktime($crondata['hour'], $crondata['minute'], 0, $monthnow, $crondata['day'], $yearnow);

// save it
$DB_site->query("
UPDATE " . TABLE_PREFIX . "cron
SET nextrun = " . $nextrun . "
WHERE cronid = " . intval($cronid) . " AND nextrun = " . $crondata['nextrun']
);
$not_run = ($DB_site->affected_rows() > 0);

build_cron_next_run($nextrun);
return iif($not_run, $nextrun, 0);
}

// ###################### Start updatenextrun #######################
function build_cron_next_run($nextrun = '')
{
global $DB_site;

// get next one to run
if (!$nextcron = $DB_site->query_first("SELECT MIN(nextrun) AS nextrun FROM " . TABLE_PREFIX . "cron"))
{
$nextcron['nextrun'] = TIMENOW + 60 * 60;
}

// update DB details
build_datastore('cron', $nextcron['nextrun']);

return $nextrun;
}

// ###################### Start cronlog #######################
// description = action that was performed
// $nextitem is an array containing the information for this cronjob
function log_cron_action($description, $nextitem)
{
global $DB_site;

if (defined('ECHO_CRON_LOG'))
{
echo "<p>$description</p>";
}

if ($nextitem['loglevel'])
{
$DB_site->query("
INSERT INTO " . TABLE_PREFIX . "cronlog
(cronid, dateline, description)
VALUES
($nextitem[cronid], " . TIMENOW . ", '" . addslashes($description) . "')
");
}
}

// ###################### Start docron #######################
function exec_cron()
{
global $DB_site, $vboptions, $workingdir, $_USEROPTIONS, $usergroupcache, $subscriptioncache;

if ($nextitem = $DB_site->query_first("SELECT * FROM " . TABLE_PREFIX . "cron WHERE nextrun <= " . TIMENOW . " ORDER BY nextrun"))
{
if ($nextrun = build_cron_item($nextitem['cronid'], $nextitem))
{
// Don't attempt chdir if getcwd() from cron.php fails .. see bug 24185
if (!empty($workingdir))
{
chdir($workingdir); // workaround for php bug 14251
}

require_once($nextitem['filename']);
}
}
else
{
build_cron_next_run();
}
}




C'est long, et j'ai volontairement viré une partie de la fonction pour qu'elle ne marche pas. Mais le script que vous voyez est capable d'automatiquement se rebuilder pour être utilisé ensuite.

Voici, par exemple, le genre de script que je vais ensuite éxécuter avec mon cron - il s'agit de la fonction de recalculation des vues du forum:
if (!is_object($DB_site))
{
exit;
}

$threads = $DB_site->query("SELECT threadid , COUNT(*) AS views FROM " . TABLE_PREFIX . "threadviews GROUP BY threadid");

while ($thread = $DB_site->fetch_array($threads))
{
$DB_site->query(
"UPDATE " . TABLE_PREFIX . "thread
SET views = views + " . intval($thread['views']) . "
WHERE threadid = " . intval($thread['threadid'])
);
}

log_cron_action('Thread Views Updated', $nextitem);

$DB_site->query("DELETE FROM " . TABLE_PREFIX . "threadviews");


Désolé si c'est long, mais y'a pas mal de trucs dedans ^_^

Hors ligne Just

  • Expert
  • ****
  • Messages: 924
    • AiN-IRC LE portail du 01 [Ain]!
Re : Cron
« Réponse #23 le: 25 Avril 2006 à 15:32:08 »
Bonjour ;)!

Tout d'abord merci pour le code.
Je l'ai lu en diagonale mais pense avoir compris, globalement c'est un Cron standart [ce qui ne veux pas dire un mauvais Cron hein ^^!].

Mais ce que nous soulevions avec jenesaisplusqui [*oups*] c'est que ton Cron actuellement a besoin d'une tiers partie pour fonctionner. Ce tiers partit étant un client, généralement qui va "visiter" la page où on aura l'appel au Cron [ici "exec_cron - si ma diagonale est bonne ^^]. C'est donc un script semi-automatique. Un automatisme complet ne necessiterais en aucun cas une intervention humaine pour activer le cron.

Bref pas de révolution... dommage :(.

Bonne journée et merci quand même d'avoir pris le temps de nous informer du code!
Just OnMyOwn ... :B
"Be CoOl, KeEp CoOl, HaVe FuN!"
-
http://www.ain-irc.net/
http://www.funpart.net/

Hors ligne BadFurDay

  • Cerveau: OFF
  • Habitué
  • **
  • Messages: 224
    • NoBleme - forum et jeux en ligne
Re : Cron
« Réponse #24 le: 25 Avril 2006 à 16:22:40 »
Oui, en effet, les crons automatiques, ça m'a pas l'air possible :D

Et puis bonne nouvelle pour ceux qui veulent un script semi-automatique, google est en train de mettre en place un système qui peut lancer un script à chaque fois qu'ils ont un visiteur, et comptent faire un système cron public et gratuit. [cf. le blog des développeurs de google y'a 1 mois environ]

Hors ligne Alx

  • Connaisseur
  • ***
  • Messages: 261
    • http://www.alliance-pbem.net
Re : Cron
« Réponse #25 le: 28 Avril 2006 à 17:26:35 »
C'est moi jenesaisplusqui lol

Je me disais aussi que ca me paraissait impossible.
Webmaster de Alliance-pbem, Jeu de rôle par e-mail dans l'univers Star Wars ™

www.alliance-pbem.net