Ускоряем друпал в 60-70 раз

Уменьшение запросов к БД в path.inc
лезть в код и править
файл path.inc
Вместо

<?php
function drupal_init_path() {
  if (!empty(
$_GET['q'])) {
    
$_GET['q'] = drupal_get_normal_path(trim($_GET['q'], '/'));
  }
  else {
    
$_GET['q'] = drupal_get_normal_path(variable_get('site_frontpage''node'));
  }
}
?>

ставить

<?php
function drupal_init_path() {
global 
$map_alias;
  
$c=count($map_alias);
if (empty(
$c))
{
$sql "Select src,dst FROM {url_alias} ";
$res=db_query($sql);
    while( 
$row=db_fetch_array($res))
    {
    
$map_alias[$row['src']]=$row['dst'];
  }
  }
  if (!empty(
$_GET['q'])) {
    
$_GET['q'] = drupal_get_normal_path(trim($_GET['q'], '/'));
  }
  else {
    
$_GET['q'] = drupal_get_normal_path(variable_get('site_frontpage''node'));
  }
}
?>

вместо

<?php
function drupal_lookup_path($action$path '') {
  static 
$map = array();
  static 
$count NULL;
  if (
$count === NULL) {
    
$count db_result(db_query('SELECT COUNT(pid) FROM {url_alias}'));
  }
  if (
$action == 'wipe') {
    
$map = array();
  }
  elseif (
$count && $path != '') {
    if (
$action == 'alias') {
      if (isset(
$map[$path])) {
        return 
$map[$path];
      }
      if (
$alias db_result(db_query("SELECT dst FROM {url_alias} WHERE src = '%s'"$path))) {
        
$map[$path] = $alias;
        return 
$alias;
      }
      else {
        
$map[$path] = $path;
      }
    }
    elseif (
$action == 'source') {
      if (
$alias array_search($path$map)) {
        return 
$alias;
      }
      if (!isset(
$map[$path])) {
        if (
$src db_result(db_query("SELECT src FROM {url_alias} WHERE dst = '%s'"$path))) {
          
$map[$src] = $path;
          return 
$src;
        }
      }
    }
  }
  return 
FALSE;
}
?>

ставим

<?php
function drupal_lookup_path($action$path '') {
global 
$map_alias;
  static 
$map = array();
  if (
$action == 'wipe') {
    
$map = array();
  }
  elseif (
$path != '') {
    if (
$action == 'alias') {
      if (!isset(
$map_alias[$path])) $map_alias[$path]=$path;
      return  
$map_alias[$path];
    }
    elseif (
$action == 'source') {
      if (
is_array($map_alias) and $alias array_search($path$map_alias)) {
        return 
$alias;
      }
      else  return 
False;
    }
  }
  return 
FALSE;
}
?>

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

Рубрики: 

Комментарии

Хакер : а на друпале 5-тых версий работает данное решение? Если работает на 5тых, то работает ли на 6-тых?

и на пятых и на шестых, вообще код для четвертой и пятой, но я воткнул в свою дру6.4 и разницу сразу же заметил.

Спасик, Хаке, сегодня вечером буду пробовать! :)

Ацца в ратан! Работает! Просто МЕГА скорость загрузки страниц! Ну кроме картинок, конечно. Но, блин, это СТОИТ того! Спасибо еще раз ХАК!

Спасибо тому кто додумался =) я сам вчера не мог нарадоваться скорости загрузки :) Помоему сравнимо с аггресивным кешированием. В общем cool =))

Хороший кусок кода, надо его на д.орг закинуть, пусть пропатчат уже официально! На своём сайте поставил, косяков не обнаружил.

Цитата:

Опубликовано neochief в вт, 09/09/2008 - 08:00.
Думаю, с увеличением количества алиасов на сайте, могут возникнуть проблемы с оперативой. В среднем, таблица алиасов для 100К записей (80К нод, 10К юзеров) занимает 12 Мб, а этот патч грузит ее всю в оперативу для каждого конекшена. Поэтому и на друпал.орг'е не спешили бы этот патч применять.

Тоже так сделал. Спасибо. Действительно шустрее начал работать :).

Спасибо! Пошустрее стало.

Кхм, это действительно сделает друпал шустрее в... 60 раз? Что-то не верится. Отпишитесь кто уже пробовал и насколько он стал шустрее работать.

---
цена контекстная реклама

Смотри комменты выше

А почему разработчики этот патч не включат? Или он что то ломает?

>> А почему разработчики этот патч не включат? Или он что то ломает?

Например потому что
таблица урл элиас у меня 21 мегабайт.
Выполнения кода, предложенного автором, сразу же отгрызет почти 25 мегабайт памяти. При условии что у вас на скрипт выделяется 32, сайт тут же станет раком.

Иначе говоря, данный хак можно использовать только в случаях, когда таблица урл алиас маленькая.

попробовал данный патч. до поры до времени все работало, пока не бд алиасов не превысил размер в 32 мб, после этого сайт встал, пришлось откатить path.inc.

Супер скрипт вообще.

Таблица алиасов у меня большой не будет, т.к. сайт статичный и ограничен количеством страниц примерно в 40-50.

Памяти есть 96М =)

Так что всё работает отично, спасибо.

Еще по теме ускорения:

http://habrahabr.ru/blogs/drupal/107094/

(Работа с системным окружением)

На 6.19 существенного ускорения не заметил, хотя и переписал его специально для 6.19 (так как ТС не учитывает language).
Так же использовал не только $map_alias, но и $map_alias_reverse.
Хотя, у меня еще path_auto включен ..

Поделитесь своим решением:)

крутая штука для небольших сайтов!

И не только