|
|
|
| Коллеги, ситуация такая.
Разбираю лог, он не большой, больше 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 в виде модуля не предлагать... | |
|
|
|
|
|
|
|
для: Alph[p]a
(03.11.2011 в 11:30)
| | задача не простая, даже при том что вы используете функцию trim для убирания пробелов из числа.
Хотелось бы увидеть пару строк из самого лог файла и узнать по какому принципу вы их выбираете. | |
|
|
|
|
|
|
|
для: 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 ***********
...................................
....
|
вот это именно один блок который мне интересен, но этот блог может быть размазан по всему файлу... | |
|
|
|
|
|
|
|
для: Alph[p]a
(03.11.2011 в 11:30)
| | А почему бы сразу в память целиком не загнать? | |
|
|
|
|
|
|
|
для: Саня
(03.11.2011 в 13:31)
| | каким образом?
вы имеете ввиду ф-ю ?
| |
|
|
|
|
|
|
|
для: Alph[p]a
(03.11.2011 в 13:52)
| | Да. А если это линукс и есть доступ к семейству функций exec(), то можно поступить проще:
<?
$lines = shell_exec("grep 'pppd\\[15613\\]' /var/log/syslog");
|
| |
|
|
|
|
|
|
|
для: Саня
(03.11.2011 в 13:53)
| | Пробывал через file, эффект минимальный, обработка занимает 30 - 40 сек. Что много.
Так где это работает, действительно линукс...
exec() - имеется, я root..
"grep 'pppd\\[15613\\]' /var/log/syslog
|
даст как бы первую фильтрацию я так понимаю, что бы php не захлебывалось сразу? | |
|
|
|
|
|
|
|
для: Alph[p]a
(03.11.2011 в 14:05)
| | Если обработка 5-7 МБ файла занимает 30-40 секунд, значит либо PHP настроен очень криво, либо лог файл на самом деле больше по размеру раз эдак в сто.
grep выудит нужные вам строки.
Если есть exec(), то можно всю тажелую работу вынести за пределы php. | |
|
|
|
|
|
|
|
для: Саня
(03.11.2011 в 14:36)
| | насчет кривости я сомневаюсь, а вот насчет кривости скрипта это да...
я выложу исходник посмотрите? | |
|
|
|
|
|
|
|
для: Alph[p]a
(03.11.2011 в 14:41)
| | И того, что есть достаточно, просто нужно больше подробностей, какая переменная за что отвечает. | |
|
|
|
|
|
|
|
для: Alph[p]a
(03.11.2011 в 11:30)
| | >$this->pptpd
А что тут хранится? Т.е. что получает getPPPDByID() в качестве аргумента? Это какие-то ключевые слова? Если да, то получается что для каждого ключевого слова вы открываете файл по-новой, будет 100 слов, будет 100 открытий и разборов файлов. Лучше пойти с другого конца, пусть будет одно открытие файла и один его разбор, но в каждая строка будет подвергаться 100 проверкам. 100 раз проверить короткую строку в оперативной памяти, это на порядки быстрее, чем 100 раз открыть и перелопатить 5-7 мб файл. | |
|
|
|