Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Оптимизация куска программы
 
 автор: Alph[p]a   (03.11.2011 в 11:30)   письмо автору
 
 

Коллеги, ситуация такая.

Разбираю лог, он не большой, больше 5-7 мб не бывает.
Немного, но скорость выполнения катастрофическая.

В конструкторе класса вызываю

...

foreach ($this->pptpd as $k=>$v) {
            // формируем массив
             $k=$k+1;
            $this->allRaw[$v]=$this->getPPPDByID($k);
        }
...


этот участок является очень узким, здесь все тормозится а именно при вызове метода getPPPDByID.
Вот его код:


    public function getPPPDByID($id) {
 $r=array();
               $id=trim($id);
               

               if ($fp=fopen($this->logFile,'r')) {
                   while ($s=fgets($fp)) {
                        if (strrpos($s,$id) and strrpos($s,'pppd')) $r[]=$s;
               }

                   return $r;
               }
               else die('error read file.');

    }


ну как то так. Как оптимизировать?
Переписать на C в виде модуля не предлагать...

  Ответить  
 
 автор: ONYX   (03.11.2011 в 13:19)   письмо автору
 
   для: Alph[p]a   (03.11.2011 в 11:30)
 

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

Хотелось бы увидеть пару строк из самого лог файла и узнать по какому принципу вы их выбираете.

  Ответить  
 
 автор: Alph[p]a   (03.11.2011 в 13:30)   письмо автору
 
   для: ONYX   (03.11.2011 в 13:19)
 

лог..

.................
......................................
Oct 31 08:06:48 relay pptpd[15612]: CTRL: Client ********* control connection started
Oct 31 08:06:48 relay pptpd[15612]: CTRL: Starting call (launching pppd, opening GRE)
Oct 31 08:06:48 relay pppd[15613]: pppd 2.4.3 started by root, uid 0
Oct 31 08:06:48 relay pppd[15613]: Changing interface to pptp0
Oct 31 08:06:48 relay pppd[15613]: Connect: pptp0 <--> /dev/pts/0
Oct 31 08:06:49 relay pptpd[15621]: CTRL: Client ********** control connection started
Oct 31 08:06:49 relay pptpd[15621]: CTRL: Starting call (launching pppd, opening GRE)
Oct 31 08:06:49 relay pppd[15622]: pppd 2.4.3 started by root, uid 0
Oct 31 08:06:49 relay pppd[15622]: Changing interface to pptp1
Oct 31 08:06:49 relay pppd[15622]: Connect: pptp1 <--> /dev/pts/1
Oct 31 08:06:52 relay pptpd[15621]: CTRL: Ignored a SET LINK INFO packet with real ACCMs!
Oct 31 08:06:52 relay pppd[15622]: Initializing LDAP connection
Oct 31 08:06:52 relay pppd[15622]: Connecting to LDAP
Oct 31 08:06:52 relay pppd[15622]: Doing LDAP lookup for buguruslan
Oct 31 08:06:52 relay pppd[15622]: LDAP found user details for buguruslan
Oct 31 08:06:52 relay pppd[15622]: Closing LDAP connection.
Oct 31 08:06:52 relay pppd[15622]: MPPE 128-bit stateless compression enabled
Oct 31 08:06:54 relay pppd[15622]: Cannot determine ethernet address for proxy ARP
Oct 31 08:06:54 relay pppd[15622]: local  IP address ***********
Oct 31 08:06:54 relay pppd[15622]: remote IP address ***********

...................................
....


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

  Ответить  
 
 автор: Саня   (03.11.2011 в 13:31)   письмо автору
 
   для: Alph[p]a   (03.11.2011 в 11:30)
 

А почему бы сразу в память целиком не загнать?

  Ответить  
 
 автор: Alph[p]a   (03.11.2011 в 13:52)   письмо автору
 
   для: Саня   (03.11.2011 в 13:31)
 

каким образом?

вы имеете ввиду ф-ю ?

file()

  Ответить  
 
 автор: Саня   (03.11.2011 в 13:53)   письмо автору
 
   для: Alph[p]a   (03.11.2011 в 13:52)
 

Да. А если это линукс и есть доступ к семейству функций exec(), то можно поступить проще:
<?
$lines 
shell_exec("grep 'pppd\\[15613\\]' /var/log/syslog");

  Ответить  
 
 автор: Alph[p]a   (03.11.2011 в 14:05)   письмо автору
 
   для: Саня   (03.11.2011 в 13:53)
 

Пробывал через file, эффект минимальный, обработка занимает 30 - 40 сек. Что много.
Так где это работает, действительно линукс...
exec() - имеется, я root..
"grep 'pppd\\[15613\\]' /var/log/syslog

даст как бы первую фильтрацию я так понимаю, что бы php не захлебывалось сразу?

  Ответить  
 
 автор: Саня   (03.11.2011 в 14:36)   письмо автору
 
   для: Alph[p]a   (03.11.2011 в 14:05)
 

Если обработка 5-7 МБ файла занимает 30-40 секунд, значит либо PHP настроен очень криво, либо лог файл на самом деле больше по размеру раз эдак в сто.

grep выудит нужные вам строки.
Если есть exec(), то можно всю тажелую работу вынести за пределы php.

  Ответить  
 
 автор: Alph[p]a   (03.11.2011 в 14:41)   письмо автору
 
   для: Саня   (03.11.2011 в 14:36)
 

насчет кривости я сомневаюсь, а вот насчет кривости скрипта это да...
я выложу исходник посмотрите?

  Ответить  
 
 автор: cheops   (03.11.2011 в 17:16)   письмо автору
 
   для: Alph[p]a   (03.11.2011 в 14:41)
 

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

  Ответить  
 
 автор: cheops   (03.11.2011 в 17:12)   письмо автору
 
   для: Alph[p]a   (03.11.2011 в 11:30)
 

>$this->pptpd
А что тут хранится? Т.е. что получает getPPPDByID() в качестве аргумента? Это какие-то ключевые слова? Если да, то получается что для каждого ключевого слова вы открываете файл по-новой, будет 100 слов, будет 100 открытий и разборов файлов. Лучше пойти с другого конца, пусть будет одно открытие файла и один его разбор, но в каждая строка будет подвергаться 100 проверкам. 100 раз проверить короткую строку в оперативной памяти, это на порядки быстрее, чем 100 раз открыть и перелопатить 5-7 мб файл.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования