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