Skip to content
Extraits de code Groupes Projets
Valider 644b34f0 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

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
parent 9cf2b292
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -350,6 +350,24 @@ function sql_fetsel( ...@@ -350,6 +350,24 @@ function sql_fetsel(
return $r2; 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 # Retourne l'unique champ demande dans une requete Select a resultat unique
// http://doc.spip.org/@sql_getfetsel // http://doc.spip.org/@sql_getfetsel
function sql_getfetsel( function sql_getfetsel(
...@@ -358,7 +376,7 @@ function sql_getfetsel( ...@@ -358,7 +376,7 @@ function sql_getfetsel(
if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) $id = $c[1]; if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) $id = $c[1];
elseif (!preg_match('/\W/', $select)) $id = $select; elseif (!preg_match('/\W/', $select)) $id = $select;
else {$id = 'n'; $select .= ' AS n';} 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; if (!$r) return NULL;
return $r[$id]; return $r[$id];
} }
......
...@@ -347,6 +347,17 @@ function fichier_copie_locale($source) { ...@@ -347,6 +347,17 @@ function fichier_copie_locale($source) {
$source = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $source); $source = preg_replace(',^'.preg_quote(_DIR_RACINE).',', '', $source);
return $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, // Si c'est deja dans la table des documents,
// ramener le nom de sa copie potentielle // ramener le nom de sa copie potentielle
...@@ -359,7 +370,6 @@ function fichier_copie_locale($source) { ...@@ -359,7 +370,6 @@ function fichier_copie_locale($source) {
// voir si l'extension indiquee dans le nom du fichier est ok // voir si l'extension indiquee dans le nom du fichier est ok
// et si il n'aurait pas deja ete rapatrie // et si il n'aurait pas deja ete rapatrie
$path_parts = pathinfo($source);
$ext = $path_parts ? $path_parts['extension'] : ''; $ext = $path_parts ? $path_parts['extension'] : '';
if ($ext AND sql_getfetsel("extension", "spip_types_documents", "extension=".sql_quote($ext))) { if ($ext AND sql_getfetsel("extension", "spip_types_documents", "extension=".sql_quote($ext))) {
......
...@@ -135,14 +135,14 @@ function quete_rubrique_fond($contexte) { ...@@ -135,14 +135,14 @@ function quete_rubrique_fond($contexte) {
if (isset($contexte['id_rubrique']) if (isset($contexte['id_rubrique'])
AND $id = intval($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'] : ''; $lang = isset($row['lang']) ? $row['lang'] : '';
return array ($id, $lang); return array ($id, $lang);
} }
if (isset($contexte['id_breve']) if (isset($contexte['id_breve'])
AND $id = intval($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']) { AND $id_rubrique_fond = $row['id_rubrique']) {
$lang = isset($row['lang']) ? $row['lang'] : ''; $lang = isset($row['lang']) ? $row['lang'] : '';
return array($id_rubrique_fond, $lang); return array($id_rubrique_fond, $lang);
...@@ -150,16 +150,16 @@ function quete_rubrique_fond($contexte) { ...@@ -150,16 +150,16 @@ function quete_rubrique_fond($contexte) {
if (isset($contexte['id_syndic']) if (isset($contexte['id_syndic'])
AND $id = intval($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 $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'] : ''; $lang = isset($row['lang']) ? $row['lang'] : '';
return array($id_rubrique_fond, $lang); return array($id_rubrique_fond, $lang);
} }
if (isset($contexte['id_article']) if (isset($contexte['id_article'])
AND $id = intval($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']) { AND $id_rubrique_fond = $row['id_rubrique']) {
$lang = isset($row['lang']) ? $row['lang'] : ''; $lang = isset($row['lang']) ? $row['lang'] : '';
return array($id_rubrique_fond, $lang); return array($id_rubrique_fond, $lang);
...@@ -181,7 +181,7 @@ function quete_parent($id_rubrique) { ...@@ -181,7 +181,7 @@ function quete_parent($id_rubrique) {
if (!$id_rubrique = intval($id_rubrique)) if (!$id_rubrique = intval($id_rubrique))
return 0; 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) if ($id_parent['id_parent']!=$id_rubrique)
return intval($id_parent['id_parent']); return intval($id_parent['id_parent']);
......
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