Уменьшение запросов к БД в path.inc (4.7)

Автор: jason32 - 25.09/2006, пн - 20:52

чё тут думать - лезть в код и править
файл path.inc
Вместо

  1. <?php
  2. function drupal_init_path() {
  3.   if (!empty($_GET['q'])) {
  4.     $_GET['q'] = drupal_get_normal_path(trim($_GET['q'], '/'));
  5.   }
  6.   else {
  7.     $_GET['q'] = drupal_get_normal_path(variable_get('site_frontpage', 'node'));
  8.   }
  9. }
  10. ?>

ставить

  1. <?php
  2. function drupal_init_path() {
  3. global $map_alias;
  4.   $c=count($map_alias);
  5. if (empty($c))
  6. {
  7. $sql = "Select src,dst FROM {url_alias} ";
  8. $res=db_query($sql);
  9.     while( $row=db_fetch_array($res))
  10.     {
  11.     $map_alias[$row['src']]=$row['dst'];
  12.   }
  13.   }
  14.   if (!empty($_GET['q'])) {
  15.     $_GET['q'] = drupal_get_normal_path(trim($_GET['q'], '/'));
  16.   }
  17.   else {
  18.     $_GET['q'] = drupal_get_normal_path(variable_get('site_frontpage', 'node'));
  19.   }
  20. }
  21. ?>

вместо

  1. <?php
  2. function drupal_lookup_path($action, $path = '') {
  3.   static $map = array();
  4.   static $count = NULL;
  5.   if ($count === NULL) {
  6.     $count = db_result(db_query('SELECT COUNT(pid) FROM {url_alias}'));
  7.   }
  8.   if ($action == 'wipe') {
  9.     $map = array();
  10.   }
  11.   elseif ($count > 0 && $path != '') {
  12.     if ($action == 'alias') {
  13.       if (isset($map[$path])) {
  14.         return $map[$path];
  15.       }
  16.       if ($alias = db_result(db_query("SELECT dst FROM {url_alias} WHERE src = '%s'", $path))) {
  17.         $map[$path] = $alias;
  18.         return $alias;
  19.       }
  20.       else {
  21.         $map[$path] = $path;
  22.       }
  23.     }
  24.     elseif ($action == 'source') {
  25.       if ($alias = array_search($path, $map)) {
  26.         return $alias;
  27.       }
  28.       if (!isset($map[$path])) {
  29.         if ($src = db_result(db_query("SELECT src FROM {url_alias} WHERE dst = '%s'", $path))) {
  30.           $map[$src] = $path;
  31.           return $src;
  32.         }
  33.       }
  34.     }
  35.   }
  36.   return FALSE;
  37. }
  38. ?>

ставим

  1. <?php
  2. function drupal_lookup_path($action, $path = '') {
  3. global $map_alias;
  4.   static $map = array();
  5.   if ($action == 'wipe') {
  6.     $map = array();
  7.   }
  8.   elseif ($path != '') {
  9.     if ($action == 'alias') {
  10.       if (!isset($map_alias[$path])) $map_alias[$path]=$path;
  11.       return  $map_alias[$path];
  12.     }
  13.     elseif ($action == 'source') {
  14.       if (is_array($map_alias) and $alias = array_search($path, $map_alias)) {
  15.         return $alias;
  16.       }
  17.       else  return False;
  18.     }
  19.   }
  20.   return FALSE;
  21. }
  22. ?>

В итоге получаем один запрос к базе вместо 60-70.

Комментарии

пробовал на версии 4.7.3 и 4.7.4 - поначалу действительно залетало, а потом тупо грузиться перестало.

а у вас что за версии?

у меня 4.7.0 с патчами, наверное поэтому и работает, в версиях 4.7.3 и 4.7.4 достаточно много изменений, а вообше лучше уже наверное 5-ю версию ставить, там и без патчей всё хорошо работает...

Сам же и отвечу на свой вопрос — с пятеркой быть очень неплохо =) Попробовал, опять таки — визуально стало все гораздо веселее =)

...документ 901 - здесь для пятёрки от того же автора...
посмотрите раздел Настройка Друпала, там есть ещё интересные решения...