From 0ec342ee19b348a27f06273f03a83e7151225d17 Mon Sep 17 00:00:00 2001 From: Fil <fil@rezo.net> Date: Mon, 26 Jan 2004 23:38:42 +0000 Subject: [PATCH] =?UTF-8?q?je=20commence=20=C3=A0=20mettre=20les=20gros=20?= =?UTF-8?q?calculs=20dans=20un=20fichier=20=C3=A0=20part=20(inc=5Fcron.php?= =?UTF-8?q?3)=20...=20pas=20garanti=20que=20=C3=A7a=20marche=20d=C3=A9j?= =?UTF-8?q?=C3=A0=20+=20il=20faut=20ajouter=20les=20taches=20de=20ecrire/?= =?UTF-8?q?=20(optimiser...)=20+=20cr=C3=A9er=20un=20fichier=20image=20pou?= =?UTF-8?q?r=20cacher=20ce=20calcul=20derri=C3=A8re?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecrire/inc_cron.php3 | 252 +++++++++++++++++++++++++++++++++++++++++ inc-public-global.php3 | 180 +---------------------------- inc-stats.php3 | 55 --------- 3 files changed, 257 insertions(+), 230 deletions(-) create mode 100644 ecrire/inc_cron.php3 diff --git a/ecrire/inc_cron.php3 b/ecrire/inc_cron.php3 new file mode 100644 index 0000000000..dbf5ffee01 --- /dev/null +++ b/ecrire/inc_cron.php3 @@ -0,0 +1,252 @@ +<?php + +// +// Ce fichier ne sera execute qu'une fois +if (defined("_ECRIRE_INC_CRON")) return; +define("_ECRIRE_INC_CRON", "1"); + + +// --------------------------------------------------------------------------------------------- +// Gestion des taches de fond + + +// +// Demarrer les referers +// +function cron_referers($t) { + ecrire_meta("date_stats_referers", $t); + ecrire_meta('calculer_referers_now', 'oui'); + ecrire_metas(); +} + +function cron_referers_suite() { + if (timeout('archiver_stats')) { + include_ecrire("inc_statistiques.php3"); + ecrire_meta('calculer_referers_now', 'non'); + ecrire_metas(); + calculer_referers(); + } +} + + +// +// Archiver les stats du jour +// +function cron_archiver_stats($last_date) { + if (timeout('archiver_stats')) { + include_ecrire("inc_meta.php3"); + include_ecrire("inc_statistiques.php3"); + ecrire_meta("date_statistiques", date("Y-m-d")); + ecrire_metas(); + calculer_visites($last_date); + + if (lire_meta('activer_statistiques_ref') == 'oui') { + // purger les referers du jour + spip_query("UPDATE spip_referers SET visites_jour=0"); + // poser un message pour traiter les referers au prochain hit + ecrire_meta('calculer_referers_now','oui'); + ecrire_metas(); + } + } +} + +// +// La fonction de base qui distribue les taches +// +function spip_cron() { + global $flag_ecrire, $dir_ecrire, $use_cache; + + @touch($dir_ecrire.'data/cron.lock'); + + include_ecrire("inc_meta.php3"); + $t = time(); + + if ($t - lire_meta('date_stats_referers') > 3600) + cron_referers($t); + + if (lire_meta('calculer_referers_now') == 'oui') + cron_referers_suite(); + + if (date("Y-m-d") <> ($last_date = lire_meta("date_statistiques"))) + cron_archiver_stats($last_date); + + if ($t - lire_meta('date_stats_popularite') > 1800) { + if (timeout('archiver_stats')) { + include_ecrire("inc_statistiques.php3"); + calculer_popularites(); + } + } + + // statistiques + if (lire_meta("activer_statistiques") != "non") { + if (timeout(false, false)) // no lock, no action + { + // Conditions declenchant un eventuel calcul des stats + if ((lire_meta('calculer_referers_now') == 'oui') + OR (date("Y-m-d") <> lire_meta("date_statistiques")) + OR (time() - lire_meta('date_stats_popularite') > 1800)) { + include_local ("inc-stats.php3"); + archiver_stats(); + } + } + } + + + // + // Envoi du mail quoi de neuf + // + if (!$flag_ecrire AND (lire_meta('quoi_de_neuf') == 'oui') AND ($jours_neuf = lire_meta('jours_neuf')) + AND ($adresse_neuf = lire_meta('adresse_neuf')) AND (time() - ($majnouv = lire_meta('majnouv'))) > 3600 * 24 * $jours_neuf) { + + if (timeout('quoide_neuf')) { + ecrire_meta('majnouv', time()); + ecrire_metas(); + + // preparation mail + unset ($mail_nouveautes); + unset ($sujet_nouveautes); + $fond = 'nouveautes'; + $delais = 0; + $contexte_inclus = array('date' => date('Y-m-d H:i:s', $majnouv)); + include(inclure_fichier($fond, $delais, $contexte_inclus)); + + // envoi + if ($mail_nouveautes) { + spip_log("envoi mail nouveautes"); + include_ecrire('inc_mail.php3'); + envoyer_mail($adresse_neuf, $sujet_nouveautes, $mail_nouveautes); + } else + spip_log("envoi mail nouveautes : pas de nouveautes"); + } + } + + + // recalcul des rubriques publiques (cas de la publication post-datee) + if (($t - lire_meta('calcul_rubriques') > 3600) AND timeout('calcul_rubriques')) { + ecrire_meta('calcul_rubriques', $t); + ecrire_metas(); + include_ecrire('inc_rubriques.php3'); + calculer_rubriques(); + } + + + // + // Faire du menage dans le cache (effacer les fichiers tres anciens ou inutilises) + // Se declenche une fois par heure quand le cache n'est pas recalcule + // + if (!$flag_ecrire AND $use_cache AND @file_exists('CACHE/.purge2')) { + if (timeout('purge_cache')) { + unlink('CACHE/.purge2'); + spip_log("purge cache niveau 2"); + $query = "SELECT fichier FROM spip_forum_cache WHERE maj < DATE_SUB(NOW(), INTERVAL 14 DAY)"; + $result = spip_query($query); + unset($fichiers); + while ($row = spip_fetch_array($result)) { + $fichier = $row['fichier']; + if (!@file_exists("CACHE/$fichier")) $fichiers[] = "'$fichier'"; + } + if ($fichiers) { + $query = "DELETE FROM spip_forum_cache WHERE fichier IN (".join(',', $fichiers).")"; + spip_query($query); + } + } + } + if (!$flag_ecrire AND $use_cache AND @file_exists('CACHE/.purge')) { + if (timeout('purge_cache')) { + $dir = 'CACHE/'.dechex((time() / 3600) & 0xF); + unlink('CACHE/.purge'); + spip_log("purge cache niveau 1: $dir"); + $f = fopen('CACHE/.purge2', 'w'); + fclose($f); + include_local ("inc-cache.php3"); + purger_repertoire($dir, 14 * 24 * 3600); + } + } + + + + // + // Gerer l'indexation automatique + // + + if (lire_meta('activer_moteur') == 'oui') { + $fichier_index = $dir_ecrire.'data/.index'; + if ($db_ok AND ($id_article OR $id_auteur OR $id_breve OR $id_mot OR $id_rubrique)) { + include_ecrire("inc_index.php3"); + $s = ''; + if ($id_article AND !deja_indexe('article', $id_article)) + $s .= "article $id_article\n"; + if ($id_auteur AND !deja_indexe('auteur', $id_auteur)) + $s .= "auteur $id_auteur\n"; + if ($id_breve AND !deja_indexe('breve', $id_breve)) + $s .= "breve $id_breve\n"; + if ($id_mot AND !deja_indexe('mot', $id_mot)) + $s .= "mot $id_mot\n"; + if ($id_rubrique AND !deja_indexe('rubrique', $id_rubrique)) + $s .= "rubrique $id_rubrique\n"; + if ($s) { + if ($f = @fopen($fichier_index, 'a')) { + fputs($f, $s); + fclose($f); + } + } + } + if ($use_cache AND @file_exists($fichier_index)) { + if (timeout('indexation')) { + include_ecrire("inc_index.php3"); + effectuer_une_indexation(); + } + } + } + + + // + // Mise a jour d'un (ou de zero) site syndique + // + + if ($db_ok AND lire_meta("activer_syndic") == "oui") { + if (timeout()) { + include_ecrire("inc_sites.php3"); + executer_une_syndication(); + if (lire_meta('activer_moteur') == 'oui') { + include_ecrire("inc_index.php3"); + executer_une_indexation_syndic(); + } + } + } + + + // + // Effacement de la poubelle (documents supprimes) + // + + if (@file_exists($fichier_poubelle = $dir_ecrire.'data/.poubelle')) { + if (timeout('poubelle')) { + if ($s = sizeof($suite = file($fichier_poubelle))) { + $s = $suite[$n = rand(0, $s)]; + $s = trim($s); + include_ecrire("inc_connect.php3"); + if ($db_ok) { + // Verifier qu'on peut vraiment effacer le fichier... + $query = "SELECT id_document FROM spip_documents WHERE fichier='$s'"; + $result = spip_query($query); + if (spip_num_rows($result) OR !ereg('^IMG/', $s) OR strpos($s, '..')) { + spip_log("Tentative d'effacement interdit: $s"); + } + else { + @unlink($s); + } + unset($suite[$n]); + $f = fopen($fichier_poubelle, 'wb'); + fwrite($f, join("", $suite)); + fclose($f); + } + } + else @unlink($fichier_poubelle); + } + } + +} + + +?> \ No newline at end of file diff --git a/inc-public-global.php3 b/inc-public-global.php3 index ba5a624e2e..7ecd6368c1 100644 --- a/inc-public-global.php3 +++ b/inc-public-global.php3 @@ -240,39 +240,6 @@ if ($HTTP_COOKIE_VARS['spip_admin'] AND !$flag_preserver AND !$flag_boutons_admi @flush(); -// --------------------------------------------------------------------------------------------- -// Taches de fond - -// -// Envoi du mail quoi de neuf -// -if ((lire_meta('quoi_de_neuf') == 'oui') AND ($jours_neuf = lire_meta('jours_neuf')) - AND ($adresse_neuf = lire_meta('adresse_neuf')) AND (time() - ($majnouv = lire_meta('majnouv'))) > 3600 * 24 * $jours_neuf) { - - if (timeout('quoide_neuf')) { - include_ecrire('inc_meta.php3'); - ecrire_meta('majnouv', time()); - ecrire_metas(); - - // preparation mail - unset ($mail_nouveautes); - unset ($sujet_nouveautes); - $fond = 'nouveautes'; - $delais = 0; - $contexte_inclus = array('date' => date('Y-m-d H:i:s', $majnouv)); - include(inclure_fichier($fond, $delais, $contexte_inclus)); - - // envoi - if ($mail_nouveautes) { - spip_log("envoi mail nouveautes"); - include_ecrire('inc_mail.php3'); - envoyer_mail($adresse_neuf, $sujet_nouveautes, $mail_nouveautes); - } else - spip_log("envoi mail nouveautes : pas de nouveautes"); - } -} - - // Mise a jour des fichiers langues de l'espace public if ($cache_lang_modifs) { include_ecrire('inc_lang.php3'); @@ -280,150 +247,13 @@ if ($cache_lang_modifs) { } -// recalcul des rubriques publiques (cas de la publication post-datee) -if ((time()-lire_meta('calcul_rubriques') > 3600) AND timeout('calcul_rubriques')) { - include_ecrire('inc_meta.php3'); - ecrire_meta('calcul_rubriques', time()); - ecrire_metas(); - include_ecrire('inc_rubriques.php3'); - calculer_rubriques(); -} - - -// -// Faire du menage dans le cache (effacer les fichiers tres anciens ou inutilises) -// Se declenche une fois par heure quand le cache n'est pas recalcule -// -if ($use_cache AND @file_exists('CACHE/.purge2')) { - if (timeout('purge_cache')) { - unlink('CACHE/.purge2'); - spip_log("purge cache niveau 2"); - $query = "SELECT fichier FROM spip_forum_cache WHERE maj < DATE_SUB(NOW(), INTERVAL 14 DAY)"; - $result = spip_query($query); - unset($fichiers); - while ($row = spip_fetch_array($result)) { - $fichier = $row['fichier']; - if (!@file_exists("CACHE/$fichier")) $fichiers[] = "'$fichier'"; - } - if ($fichiers) { - $query = "DELETE FROM spip_forum_cache WHERE fichier IN (".join(',', $fichiers).")"; - spip_query($query); - } - } -} -if ($use_cache AND @file_exists('CACHE/.purge')) { - if (timeout('purge_cache')) { - $dir = 'CACHE/'.dechex((time() / 3600) & 0xF); - unlink('CACHE/.purge'); - spip_log("purge cache niveau 1: $dir"); - $f = fopen('CACHE/.purge2', 'w'); - fclose($f); - include_local ("inc-cache.php3"); - purger_repertoire($dir, 14 * 24 * 3600); - } -} - - -// -// Archivage des statistiques du site public -// - -if (lire_meta("activer_statistiques") != "non") { - if (timeout(false, false)) // no lock, no action - { - // Conditions declenchant un eventuel calcul des stats - if ((lire_meta('calculer_referers_now') == 'oui') - OR (date("Y-m-d") <> lire_meta("date_statistiques")) - OR (time() - lire_meta('date_stats_popularite') > 1800)) { - include_local ("inc-stats.php3"); - archiver_stats(); - } - } +// Gestion des taches de fond ? toutes les 30 secondes (sauf preemption par une image-cron) +if (!@file_exists('ecrire/data/cron.lock') +OR (time() - @filemtime('ecrire/data/cron.lock') > 30)) { + include_ecrire('inc_cron.php3'); + spip_cron(); } - -// -// Gerer l'indexation automatique -// - -if (lire_meta('activer_moteur') == 'oui') { - $fichier_index = 'ecrire/data/.index'; - if ($db_ok AND ($id_article OR $id_auteur OR $id_breve OR $id_mot OR $id_rubrique)) { - include_ecrire("inc_index.php3"); - $s = ''; - if ($id_article AND !deja_indexe('article', $id_article)) - $s .= "article $id_article\n"; - if ($id_auteur AND !deja_indexe('auteur', $id_auteur)) - $s .= "auteur $id_auteur\n"; - if ($id_breve AND !deja_indexe('breve', $id_breve)) - $s .= "breve $id_breve\n"; - if ($id_mot AND !deja_indexe('mot', $id_mot)) - $s .= "mot $id_mot\n"; - if ($id_rubrique AND !deja_indexe('rubrique', $id_rubrique)) - $s .= "rubrique $id_rubrique\n"; - if ($s) { - if ($f = @fopen($fichier_index, 'a')) { - fputs($f, $s); - fclose($f); - } - } - } - if ($use_cache AND @file_exists($fichier_index)) { - if (timeout('indexation')) { - include_ecrire("inc_index.php3"); - effectuer_une_indexation(); - } - } -} - - -// -// Mise a jour d'un (ou de zero) site syndique -// - -if ($db_ok AND lire_meta("activer_syndic") == "oui") { - if (timeout()) { - include_ecrire("inc_sites.php3"); - executer_une_syndication(); - if (lire_meta('activer_moteur') == 'oui') { - include_ecrire("inc_index.php3"); - executer_une_indexation_syndic(); - } - } -} - - -// -// Effacement de la poubelle (documents supprimes) -// - -if (@file_exists($fichier_poubelle = "ecrire/data/.poubelle")) { - if (timeout('poubelle')) { - if ($s = sizeof($suite = file($fichier_poubelle))) { - $s = $suite[$n = rand(0, $s)]; - $s = trim($s); - include_ecrire("inc_connect.php3"); - if ($db_ok) { - // Verifier qu'on peut vraiment effacer le fichier... - $query = "SELECT id_document FROM spip_documents WHERE fichier='$s'"; - $result = spip_query($query); - if (spip_num_rows($result) OR !ereg('^IMG/', $s) OR strpos($s, '..')) { - spip_log("Tentative d'effacement interdit: $s"); - } - else { - @unlink($s); - } - unset($suite[$n]); - $f = fopen($fichier_poubelle, 'wb'); - fwrite($f, join("", $suite)); - fclose($f); - } - } - else @unlink($fichier_poubelle); - } -} - - // // Gestion des statistiques du site public // (a la fin pour ne pas forcer le $db_ok) diff --git a/inc-stats.php3 b/inc-stats.php3 index 617e127806..4c17686429 100644 --- a/inc-stats.php3 +++ b/inc-stats.php3 @@ -55,61 +55,6 @@ function ecrire_stats() { spip_query($query); } } - - // Traiter les referers toutes les heures - $date_refs = lire_meta('date_stats_referers'); - if ((time() - $date_refs) > 3600) { - include_ecrire("inc_meta.php3"); - ecrire_meta("date_stats_referers", time()); - ecrire_meta('calculer_referers_now', 'oui'); - ecrire_metas(); - } -} - - -function archiver_stats() { - // - // Archivage des visites temporaires - // - - // referers pas finis ? - if (lire_meta('calculer_referers_now') == 'oui') { - if (timeout('archiver_stats')) { - include_ecrire("inc_meta.php3"); - include_ecrire("inc_statistiques.php3"); - ecrire_meta('calculer_referers_now', 'non'); - ecrire_metas(); - calculer_referers(); - } - } - - // nettoyage du matin - if (date("Y-m-d") <> ($last_date = lire_meta("date_statistiques"))) { - if (timeout('archiver_stats')) { - include_ecrire("inc_meta.php3"); - include_ecrire("inc_statistiques.php3"); - ecrire_meta("date_statistiques", date("Y-m-d")); - ecrire_metas(); - calculer_visites($last_date); - - if (lire_meta('activer_statistiques_ref') == 'oui') { - // purger les referers du jour - spip_query("UPDATE spip_referers SET visites_jour=0"); - // poser un message pour traiter les referers au prochain hit - ecrire_meta('calculer_referers_now','oui'); - ecrire_metas(); - } - } - } - - // popularite, mise a jour une demi-heure - $date_popularite = lire_meta('date_stats_popularite'); - if ((time() - $date_popularite) > 1800) { - if (timeout('archiver_stats')) { - include_ecrire("inc_statistiques.php3"); - calculer_popularites(); - } - } } -- GitLab