Skip to content
Extraits de code Groupes Projets
Valider 921d19bb rédigé par Fil's avatar Fil
Parcourir les fichiers

Un peu plus de verifications avant de calculer les statistiques du site :

- ne pas calculer les stats sur perte du fichier .lock (typiquement lors d'un upgrade... qui a dit "trop tard" ?)
- bloquer les cron via un lock SQL, afin de permettre d'exploiter une meme base MySQL avec des installations de SPIP différentes (ne règle pas entièrement la question, il reste le cache)
parent 5f287ed6
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -25,7 +25,7 @@ define("_ECRIRE_INC_CRON", "1"); ...@@ -25,7 +25,7 @@ define("_ECRIRE_INC_CRON", "1");
// Solution: // Solution:
// les scripts usuels les plus brefs, en plus de livrer la page demandee, // les scripts usuels les plus brefs, en plus de livrer la page demandee,
// s'achevent par un appel à la fonction spip_cron. // s'achevent par un appel a la fonction spip_cron.
// Celle-ci prend dans la liste des taches a effectuer la plus prioritaire. // Celle-ci prend dans la liste des taches a effectuer la plus prioritaire.
// Une seule tache est executee pour eviter la guillotine des 30 secondes. // Une seule tache est executee pour eviter la guillotine des 30 secondes.
// Une fonction executant une tache doit retourner un nombre: // Une fonction executant une tache doit retourner un nombre:
...@@ -78,7 +78,12 @@ function spip_cron($taches=array()) { ...@@ -78,7 +78,12 @@ function spip_cron($taches=array()) {
clearstatcache(); clearstatcache();
$last = @filemtime($lock); $last = @filemtime($lock);
if (spip_touch($lock, $frequence_taches[$tache])) { // On opere un double lock : un dans _DIR_SESSIONS, pour les hits
// (en parallele sur le meme site) ; et un autre dans la base de
// donnees, de maniere a eviter toute concurrence entre deux SPIP
// differents partageant la meme base (replication de serveurs Web)
if (spip_touch($lock, $frequence_taches[$tache])
AND spip_get_lock('cron'.$tache)) {
spip_timer('tache'); spip_timer('tache');
include_ecrire('inc_' . $tache . _EXTENSION_PHP); include_ecrire('inc_' . $tache . _EXTENSION_PHP);
$fonction = 'cron_' . $tache; $fonction = 'cron_' . $tache;
...@@ -89,12 +94,12 @@ function spip_cron($taches=array()) { ...@@ -89,12 +94,12 @@ function spip_cron($taches=array()) {
# modifier la date du fichier # modifier la date du fichier
@touch($lock, (0 - $code_de_retour)); @touch($lock, (0 - $code_de_retour));
spip_log($msg . " (en cours, " . spip_timer('tache') .")"); spip_log($msg . " (en cours, " . spip_timer('tache') .")");
spip_timer('tache');
} }
else else
spip_log($msg . " (" . spip_timer('tache') . ")"); spip_log($msg . " (" . spip_timer('tache') . ")");
break; break;
} }
spip_release_lock('cron'.$tache);
} }
} }
} }
...@@ -205,10 +210,13 @@ function cron_popularites($t) { ...@@ -205,10 +210,13 @@ function cron_popularites($t) {
} }
function cron_visites($t) { function cron_visites($t) {
calculer_visites(); // Si le fichier .lock est absent, ne pas calculer (mais reparer la date
// du .lock de maniere a commencer a 00:00:01 demain).
if ($t) calculer_visites();
// il vaut mieux le lancer peu apres minuit, // il vaut mieux le lancer peu apres minuit,
// donc on retourne "aujourd'hui a 0h 0m 1s // donc on pretend avoir ete execute precisement "ce matin a 00:00:01"
// pour etre appele demain a cette heure // pour etre appele demain a la meme heure
return 0 - (strtotime(date("d F Y", time()))+60); return 0 - (strtotime(date("d F Y", time()))+60);
} }
......
...@@ -15,55 +15,70 @@ ...@@ -15,55 +15,70 @@
if (defined("_ECRIRE_INC_VISITES")) return; if (defined("_ECRIRE_INC_VISITES")) return;
define("_ECRIRE_INC_VISITES", "1"); define("_ECRIRE_INC_VISITES", "1");
function calculer_visites($date = "") { function calculer_visites($t) {
// Date par defaut = hier // La date des enregistrements de spip_visites_temp correspond a la veille
if (!$date) $date = date("Y-m-d", time() - 24 * 3600); // du calcul.
$hier = date("Y-m-d", time() - 24*3600);
// Sur tout le site, nombre de visiteurs uniques pendant la journee // Sur tout le site, nombre de visiteurs uniques pendant la periode
// qui precede (normalement, une journee)
$query = "SELECT COUNT(DISTINCT ip) AS total_visites FROM spip_visites_temp"; $query = "SELECT COUNT(DISTINCT ip) AS total_visites FROM spip_visites_temp";
$result = spip_query($query); $result = spip_query($query);
if ($row = @spip_fetch_array($result)) if ($row = @spip_fetch_array($result))
$total_visites = $row['total_visites']; $total_visites = $row['total_visites'];
else else
$total_visites = 0; $total_visites = 0;
$query_insert = "INSERT INTO spip_visites (date, visites) VALUES ('$date', $total_visites)"; spip_query("INSERT IGNORE INTO spip_visites
$result_insert = spip_query($query_insert); (date, visites) VALUES ('$hier', 0)");
spip_query("UPDATE spip_visites SET visites = visites+$total_visites
WHERE date='$hier'");
// Nombre de visiteurs uniques par article // Nombre de visiteurs uniques par article
$query = "SELECT COUNT(DISTINCT ip) AS visites, id_objet FROM spip_visites_temp ". $query = "SELECT COUNT(DISTINCT ip) AS visites, id_objet
"WHERE type='article' GROUP BY id_objet"; FROM spip_visites_temp WHERE type='article' GROUP BY id_objet";
$result = spip_query($query); $result = spip_query($query);
$visites_insert = ""; $visites_insert = array();
$visites_update = ""; $visites_update = array();
while ($row = @spip_fetch_array($result)) { while ($row = @spip_fetch_array($result)) {
$id_article = $row['id_objet']; $id_article = $row['id_objet'];
$visites = $row['visites']; $visites = $row['visites'];
$visites_update[$visites][] = $id_article; $visites_update[$visites][] = $id_article;
$visites_insert[] = "('$date', $id_article, $visites)";
} }
$query_effacer = "DELETE FROM spip_visites_temp"; $query_effacer = "DELETE FROM spip_visites_temp";
$result_effacer = spip_query($query_effacer); $result_effacer = spip_query($query_effacer);
// Mise a jour de la base // Mise a jour de la base
if (is_array($visites_update)) { foreach ($visites_update as $visites => $articles) {
while (list($visites, $articles) = each($visites_update)) { // Augmenter les stats totales des articles
$query = "UPDATE spip_articles SET maj=maj, visites = visites + $visites ". spip_query("UPDATE spip_articles SET maj=maj,
"WHERE id_article IN (".join(', ', $articles).")"; visites = visites + $visites
$result = spip_query($query); WHERE id_article IN (".join(',', $articles).")");
} // Inserer des visites pour la journee (si pas deja fait)
$insert = "('$hier',0,". join ("),('$hier',0,", $articles) . ')';
spip_query("INSERT IGNORE INTO spip_visites_articles
(date, visites, id_article) VALUES $insert");
// Augmenter les stats des visites de la journee
spip_query("UPDATE spip_visites_articles
SET visites=visites+$visites WHERE date='$hier'
AND id_article IN (".join(',', $articles).")");
} }
if (is_array($visites_insert)) {
$query_insert = "INSERT IGNORE INTO spip_visites_articles (date, id_article, visites) ". // Une fois par jour purger les referers du jour ; qui deviennent
"VALUES ".join(', ', $visites_insert); // donc ceux de la veille ; au passage on stocke une date_statistiques
$result_insert = spip_query($query_insert); // dans spip_meta - cela permet au code d'etre "reentrant", ie ce cron
// peut etre appele par deux bases SPIP ne partageant pas le meme
// _DIR_SESSIONS, sans tout casser...
$aujourdhui = date("Y-m-d");
if ($date_referers = lire_meta('date_statistiques')
AND $date_referers != $aujourdhui) {
spip_query("UPDATE spip_referers SET visites_veille=visites_jour, visites_jour=0");
} }
# purger les referers du jour qui deviennent ceux de la veille ecrire_meta('date_statistiques', $aujourdhui);
spip_query("UPDATE spip_referers SET visites_veille=visites_jour, visites_jour=0"); ecrire_metas();
return 1; return 1;
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter