From 644b34f0064b830c01973d0d08bbb88995d54a30 Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Thu, 19 Jun 2008 08:08:35 +0000 Subject: [PATCH] optimisations du nombre de requetes sql hors compilation : on introduit un sql_fetsel_cache qui cache les resultats, a utiliser sur les requetes identiques repetitives dans un meme hit on applique aux requetes de parametrer qui coutent en cas d'inclusions nombreuses sql_getfetsel passe par sql_fetsel_cache systematiquement (on presume que cette valeur unique est suceptible de servir plusieurs fois) fichier_copie_locale economise aussi une ou deux requetes par document distant deja rapatrie --- ecrire/base/abstract_sql.php | 20 +++++++++++++++++++- ecrire/inc/distant.php | 12 +++++++++++- ecrire/public/parametrer.php | 12 ++++++------ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/ecrire/base/abstract_sql.php b/ecrire/base/abstract_sql.php index c41e800aef..9962c91a5d 100644 --- a/ecrire/base/abstract_sql.php +++ b/ecrire/base/abstract_sql.php @@ -350,6 +350,24 @@ function sql_fetsel( return $r2; } +# une composition tellement frequente... +# avec un cache en plus pour les requetes repetitives sur un meme hit +function sql_fetsel_cache( + $select = array(), $from = array(), $where = array(), + $groupby = array(), $orderby = array(), $limit = '', + $having = array(), $serveur='', $option=true) { + static $cache_fetsel=array(); + $req = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false); + if ($option==false) return $req; + $k = md5($req); + if (isset($cache_fetsel[$k])) return $cache_fetsel[$k]; + $r = sql_query($req, $serveur, $option!==false); + if (!$r) return $cache_fetsel[$k]=NULL; + $r2 = sql_fetch($r, $serveur, $option!==false); + sql_free($r, $serveur, $option!==false); + return $cache_fetsel[$k]=$r2; +} + # Retourne l'unique champ demande dans une requete Select a resultat unique // http://doc.spip.org/@sql_getfetsel function sql_getfetsel( @@ -358,7 +376,7 @@ function sql_getfetsel( if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) $id = $c[1]; elseif (!preg_match('/\W/', $select)) $id = $select; else {$id = 'n'; $select .= ' AS n';} - $r = sql_fetsel($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option!==false); + $r = sql_fetsel_cache($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option!==false); if (!$r) return NULL; return $r[$id]; } diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php index e95a3e6b07..1e2ab13b08 100644 --- a/ecrire/inc/distant.php +++ b/ecrire/inc/distant.php @@ -347,6 +347,17 @@ function fichier_copie_locale($source) { $source = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $source); return $source; } + + // optimisation : on regarde si on peut deviner l'extension dans l'url et si le fichier + // a deja ete copie en local avec cette extension + // dans ce cas elle est fiable, pas la peine de requeter en base + $path_parts = pathinfo($source); + $ext = $path_parts ? $path_parts['extension'] : ''; + if ($ext + AND $f=nom_fichier_copie_locale($source, $ext) + AND file_exists(_DIR_RACINE . $f)) + return $f; + // Si c'est deja dans la table des documents, // ramener le nom de sa copie potentielle @@ -359,7 +370,6 @@ function fichier_copie_locale($source) { // voir si l'extension indiquee dans le nom du fichier est ok // et si il n'aurait pas deja ete rapatrie - $path_parts = pathinfo($source); $ext = $path_parts ? $path_parts['extension'] : ''; if ($ext AND sql_getfetsel("extension", "spip_types_documents", "extension=".sql_quote($ext))) { diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php index 8127eb73fe..fb55cc4198 100644 --- a/ecrire/public/parametrer.php +++ b/ecrire/public/parametrer.php @@ -135,14 +135,14 @@ function quete_rubrique_fond($contexte) { if (isset($contexte['id_rubrique']) AND $id = intval($contexte['id_rubrique']) - AND $row = sql_fetsel('lang', 'spip_rubriques',"id_rubrique=$id")) { + AND $row = sql_fetsel_cache('id_parent, lang', 'spip_rubriques',"id_rubrique=$id")) { $lang = isset($row['lang']) ? $row['lang'] : ''; return array ($id, $lang); } if (isset($contexte['id_breve']) AND $id = intval($contexte['id_breve']) - AND $row = sql_fetsel('id_rubrique, lang', 'spip_breves', "id_breve=$id") + AND $row = sql_fetsel_cache('id_rubrique, lang', 'spip_breves', "id_breve=$id") AND $id_rubrique_fond = $row['id_rubrique']) { $lang = isset($row['lang']) ? $row['lang'] : ''; return array($id_rubrique_fond, $lang); @@ -150,16 +150,16 @@ function quete_rubrique_fond($contexte) { if (isset($contexte['id_syndic']) AND $id = intval($contexte['id_syndic']) - AND $row = sql_fetsel('id_rubrique', 'spip_syndic', "id_syndic=$id") + AND $row = sql_fetsel_cache('id_rubrique', 'spip_syndic', "id_syndic=$id") AND $id_rubrique_fond = $row['id_rubrique'] - AND $row = sql_fetsel('lang', 'spip_rubriques', "id_rubrique=$id_rubrique_fond")) { + AND $row = sql_fetsel_cache('id_parent, lang', 'spip_rubriques', "id_rubrique=$id_rubrique_fond")) { $lang = isset($row['lang']) ? $row['lang'] : ''; return array($id_rubrique_fond, $lang); } if (isset($contexte['id_article']) AND $id = intval($contexte['id_article']) - AND $row = sql_fetsel('id_rubrique, lang', 'spip_articles', "id_article=$id") + AND $row = sql_fetsel_cache('id_rubrique, lang', 'spip_articles', "id_article=$id") AND $id_rubrique_fond = $row['id_rubrique']) { $lang = isset($row['lang']) ? $row['lang'] : ''; return array($id_rubrique_fond, $lang); @@ -181,7 +181,7 @@ function quete_parent($id_rubrique) { if (!$id_rubrique = intval($id_rubrique)) return 0; - $id_parent = sql_fetsel('id_parent','spip_rubriques',"id_rubrique=" . $id_rubrique); + $id_parent = sql_fetsel_cache('id_parent, lang','spip_rubriques',"id_rubrique=" . $id_rubrique); if ($id_parent['id_parent']!=$id_rubrique) return intval($id_parent['id_parent']); -- GitLab