Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Оптимизация запроса

Ответить
Настройки темы
Оптимизация запроса

Ветеран


Сообщения: 573
Благодарности: 8


Конфигурация

Профиль | Отправить PM | Цитировать


Есть класс:

PHP код: Выделить весь код

class highlighter

{
    
private $_string;
     
private $_words;
     
private $_opentags;
     
private $_usedTags = array();

     
public function __construct$string$words$opentags )
     {
         
$this->_string $string;
         
$this->_words $words;
         
$this->_opentags $opentags;
     }

     
private function countWordLength$wordForms )
     {
         
$formsNum count$wordForms );
         
$len 0;
         for( 
$j 0$j $formsNum$j++ )
         {
             
$len += strlen$wordForms[$j] );
         }
         
$len $len $formsNum;
        return 
$len;
     }
    
private function swap( &$var1, &$var2 )
    {
        
$temp $var1;
        
$var1 $var2;
        
$var2 $temp;
    }
     
public function prepareWordArray()
     {
         
$wordsNum count$this->_words );
         
$words $this->_words;
         
$opentags = &$this->_opentags;
         
$closetags = &$this->_closetags;
         
$n 1;
         while( 
$n != 0)
         {
             
$n 0;
             for( 
$i 0$i < ( $wordsNum ); $i++ )
             {
                 
$len1 $this->countWordLength$words[$i] );
                 
$len2 $this->countWordLength$words[$i 1] );
                 if( 
$len1 $len2 ) {
                     
$this->swap( &$words[$i], $words[$i 1] );
                     
$this->swap( &$opentags[$i], $opentags[$i 1] );
                     
$n++;
                 }
             }
         }
         
$this->_words $words;

     }

     
private function isWord$pos$len)
     {
         
$chars ".?()[]\"',/\\ !@#$%^&*{}<>`~№;:?";
         
$string $this->_string;
         
$a $b true;
        if (
$pos 1) {
            if (
strpos($chars$string[$pos 1])===false) {
                
$a false;
               } else {
               }
          }
          if (
substr$string$pos 66) == '<used>') {
              return 
false;
          }
          if( 
substr$string$pos $len7) == '</used>') {
              return 
false;
          }
          if (isset( 
$string[$pos $len] )) {
              if (
strpos$chars,$string[$pos $len] )===false ) {
                
$b false;
               } else {
            }
          }
          if (
$a && $b) {
           return 
true;
         } else {
             return 
false;
         }
     }

     
public function findWordForms$wordID )
     {
         
$forms $this->_words[$wordID];
         
$formsNum count$forms );
         
$string = &$this->_string;
         
$minPos strlen$string );
         
$minLen 0;
         
$found false;
         for( 
$i 0$i $formsNum$i++ )
         {
             
$stringLen strlen$string );
             
$word $forms[$i];
             
$pos 0;
             
$len strlen$word );
             
$next false;
             while ( ( 
$pos $len ) < $stringLen )
             {
                 
$pos stripos$string$word$pos );
                 if ( 
$pos === false ) {
                     break;
                 }
                 if (
$this->isWord$pos$len )) {
                     if( 
$pos $minPos ) {
                         
$minPos $pos 6;
                         
$minLen $len;
                         
$found true;
                     }
                     
$word substr$string$pos$len );
                     
$string substr_replace(  $string'<used>'.$word.'</used>'$pos$len )."\n";
                     
$next true;
                     break;
                 } else {
                 }
                 
$pos += $len;
             }
         }
         if( 
$found ) {
             if (!
in_array$this->_opentags[$wordID], $this->_usedTags )) {
                
$word substr$string$minPos 6$minLen 13 );
                
$string substr_replace$string$this->_opentags[$wordID].$word.'</a>'$minPos$minLen);
                
$this->_usedTags[] = $this->_opentags[$wordID];
            }

         }
     }
     
public function highlight()
     {
         
$n count$this->_words );
         for( 
$i 0$i $n$i++ )
         {
             
$this->findWordForms$i );
         }
     }

     
public function getResult()
     {
         
$this->prepareWordArray();
         
$this->highlight();
         
$string = & $this->_string;
         
$string str_replace( array( '<used>''</used>'), array( '''' ), $string );
         return 
$this->_string;
     }


В массив выводятся слова и ссылки:

PHP код: Выделить весь код

$result $db->sql_query("select tid, title from ".$prefix."_table");

while (
$crow=$db->sql_fetchrow($result)) {
    
$tid=$crow['tid'];
    
$words[]=array($crow['title']);
    
$open_tags[]="<a href=\"modules.php?name=Encyclopedia&op=content&tid=$tid\">";


Потом в контенте выделяются соотвественные слова из указанного массива выше:

PHP код: Выделить весь код

global $words$open_tags;

$class = new highlighter($text$words$open_tags);
echo 
$class->getResult(); 

В базе в таблице table всего 1200 записей, но когда грузится страница с контентом и идет эта обработка (выделение слов, оборачивание ссылками), страница грузится очень долго более 20 секунд!

Подскажите пожалуйста, как оптимизировать запрос?

Отправлено: 20:36, 01-04-2009

 

Ветеран


Сообщения: 1862
Благодарности: 132

Профиль | Сайт | Отправить PM | Цитировать


Смотри сам на время обработки. При помощи такого приёма:
PHP код: Выделить весь код

$mtime explode (" "microtime ());        //Считываем текущее время  //Разделяем секунды и миллисекунды

  
$time_start $mtime [1] + $mtime [0];       //Составляем одно число из секунд и миллисекунд  //Записываем стартовое время в переменную
$q 0;
########################################################################

while ($crow=$db->sql_fetchrow($result)) { 
    
$tid=$crow['tid']; 
    
$words[]=array($crow['title']); 
    
$open_tags[]="<a href=\"modules.php?name=Encyclopedia&op=content&tid=$tid\">"
    ++
$q;
}

 
#####################################################
    
$mtime explode (" "microtime ());
    
$time_end  $mtime [1] + $mtime [0];        //Делаем все то же самое, чтобы получить текущее время  //Записываем время окончания в другую переменную
    
$total_time = ($time_end $time_start);     //Вычисляем разницу
    
echo '<br />'.$q.'<br />'.$total_time

sql_fetchrow($result) - что-то не нашёл этого?

-------
ДИЛЕТАНТ - это курьезный человек, который испытывает удовольствие делать то, чего не умеет.
AMD 4200+, MSI Neo2Platinum, 2Gb, ATI 9600, D-Link DWL-G510, FreeBSD 8.0, KDE 4.3.4

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:09, 03-04-2009 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 573
Благодарности: 8

Профиль | Отправить PM | Цитировать


Цитата Igor_I:
sql_fetchrow($result) - что-то не нашёл этого? »
Т.е. ?

скрипт выдал такие цифры:

1144
0.020478963851929


И как быть, что это значит?

Отправлено: 09:49, 04-04-2009 | #3


Ветеран


Сообщения: 1862
Благодарности: 132

Профиль | Сайт | Отправить PM | Цитировать


Это значит
1144 цикла прошли за 0.02 секунды.
А если вот так.
PHP код: Выделить весь код

$mtime explode (" "microtime ());        //Считываем текущее время  //Разделяем секунды и миллисекунды 

$time_start $mtime [1] + $mtime [0];       //Составляем одно число из секунд и миллисекунд  //Записываем стартовое время в переменную 

######################################################################## 

$result $db->sql_query("select tid, title from ".$prefix."_table");

 
##################################################### 
    
$mtime explode (" "microtime ()); 
    
$time_end  $mtime [1] + $mtime [0];        //Делаем все то же самое, чтобы получить текущее время  //Записываем время окончания в другую переменную 
    
$total_time1 = ($time_end $time_start);     //Вычисляем разницу 




$mtime explode (" "microtime ());        //Считываем текущее время  //Разделяем секунды и миллисекунды 
$time_start $mtime [1] + $mtime [0];       //Составляем одно число из секунд и миллисекунд  //Записываем стартовое время в переменную 
$q 0
######################################################################## 

while ($crow=$db->sql_fetchrow($result)) {  
    
$tid=$crow['tid'];  
    
$words[]=array($crow['title']);  
    
$open_tags[]="<a href=\"modules.php?name=Encyclopedia&op=content&tid=$tid\">";  
    ++
$q


 
##################################################### 
    
$mtime explode (" "microtime ()); 
    
$time_end  $mtime [1] + $mtime [0];        //Делаем все то же самое, чтобы получить текущее время  //Записываем время окончания в другую переменную 
    
$total_time2 = ($time_end $time_start);     //Вычисляем разницу 
    
echo '<br />'.$q.'<br />'.$total_time1.'<br />'.$total_time2

Если цифры опять будут маленькие, то либо не там ищешь, либо что-то путаешь.

В таком случае 2 варианта
1 http://tools.pingdom.com
2 Yslow для Firefox.

-------
ДИЛЕТАНТ - это курьезный человек, который испытывает удовольствие делать то, чего не умеет.
AMD 4200+, MSI Neo2Platinum, 2Gb, ATI 9600, D-Link DWL-G510, FreeBSD 8.0, KDE 4.3.4


Отправлено: 17:04, 04-04-2009 | #4


Ветеран


Сообщения: 573
Благодарности: 8

Профиль | Отправить PM | Цитировать


вот проверил:
PHP код: Выделить весь код

1144

0.0097150802612305
0.023669004440308 

Может это дело в том длинном классе?

Отправлено: 18:54, 04-04-2009 | #5


Ветеран


Сообщения: 1862
Благодарности: 132

Профиль | Сайт | Отправить PM | Цитировать


venuko,
Ставь в начале скрипта
PHP код: Выделить весь код

$mtime explode (" "microtime ());        //Считываем текущее время  //Разделяем секунды и миллисекунды  

$time_start $mtime [1] + $mtime [0];       //Составляем одно число из секунд и миллисекунд  //Записываем стартовое время в переменную  

######################################################################## 

Это в конце скрипта.

PHP код: Выделить весь код

#####################################################  

    
$mtime explode (" "microtime ());  
    
$time_end  $mtime [1] + $mtime [0];        //Делаем все то же самое, чтобы получить текущее время  //Записываем время окончания в другую переменную  
    
$total_time1 = ($time_end $time_start);     //Вычисляем разницу 

echo '<br />'.$total_time1

Как варант - не парсить каждый раз заново текст, а сохранять его.

-------
ДИЛЕТАНТ - это курьезный человек, который испытывает удовольствие делать то, чего не умеет.
AMD 4200+, MSI Neo2Platinum, 2Gb, ATI 9600, D-Link DWL-G510, FreeBSD 8.0, KDE 4.3.4


Отправлено: 12:40, 05-04-2009 | #6


Ветеран


Сообщения: 573
Благодарности: 8

Профиль | Отправить PM | Цитировать


PHP код: Выделить весь код

0.018907070159912 



Кажется у хостера проблемы с nginx, так как на этом айпи все сайты также грузятся, елки

Отправлено: 18:00, 05-04-2009 | #7


Ветеран


Сообщения: 1862
Благодарности: 132

Профиль | Сайт | Отправить PM | Цитировать


Можно адресок?

-------
ДИЛЕТАНТ - это курьезный человек, который испытывает удовольствие делать то, чего не умеет.
AMD 4200+, MSI Neo2Platinum, 2Gb, ATI 9600, D-Link DWL-G510, FreeBSD 8.0, KDE 4.3.4


Отправлено: 00:11, 06-04-2009 | #8



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Оптимизация запроса

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Пример GET запроса AnatoliyKukalev AutoIt 2 28-04-2010 22:00
Оптимизация запроса venuko Вебмастеру 7 27-02-2009 12:10
MSFT SQL Server - Форматирование запроса SQL ValVlaGen Программирование и базы данных 11 26-11-2008 12:27
MySQL - Исполнение sql запроса в скрипте Negativ Программирование и базы данных 1 09-08-2007 14:59
SSH без запроса пароля Ge0rge Общий по Linux 13 16-06-2003 18:45




 
Переход