Проблема с обработкой файлов большого размера

Ripper

Новичок
Проблема с обработкой файлов большого размера

Сабж заключается в следующем есть логи WinGAte они растут довольно динамично. Проблема в следующем как токо обем логов возрастает хотябы до 700 Кб комп начинает долго думать и чтото грузить. Я подозреваю что я чтото не так зделал с чтением и записю файлов.

Выкладываю строки как я читал файлы и записывал.
$buffer_path="C:\Program Files\WinGate\Audit\\$_POST[user]\buffer.log";
//Пусть к файлу логов
$file_path="C:\Program Files\WinGate\Audit\\$_POST[user]\\$_POST[user].log";
//Пусть к файлу содержашему стартовую строчку
$line_path="C:\Program Files\WinGate\Audit\\$_POST[user]\\line.log";
//Создание файла буфера

if(!file_exists($buffer_path))
{
$create=fopen($buffer_path,"w") or die("Не могу создать файл буфера");
fclose($create);
}

//Соозданиее файла с номером строки
if(!file_exists($line_path))
{
$create=fopen($line_path,"w") or die("Не могу создать файл Строки");
fputs ($create, "0");
fclose($create);
}
else
{
$line_s=file($line_path) or die("Невозможно считать число из Файла Строки");
for($i=0; $i <1; $i++)
{
$n=$line_s[$i]; //получение номера строчки
echo "$n</br>";
}
fclose($line_s);
}
//Создание файла содержащего число последней строчки или получени
$file_s=file($file_path) or die("Невозможно открыть Log-файл wwwProxy");
$num_str = count($file_s);
fclose($file_s);
//Заполнение буфера
$buffer_s=fopen($buffer_path,w);
for($n; $n < $num_str; $n++)
{
fputs($buffer_s, $file_s[$n]);
}
fclose($buffer_s);
//Повторное чтение
$buffer_s=fopen($buffer_path,"r") or die("Не могу открыть файл буфера");
while(!feof($buffer_s))
{
$buffer = $buffer.fgets($buffer_s,4096);
}
fclose($buffer_s);

-~{}~ 06.02.06 20:57:

После идет обработка непосредственно файла

$massive_str=explode("\n",$buffer);
for ($i=0; $massive_str[$i] != NULL; $i++)
{
$massive_row=explode("\t",$massive_str[$i]);
$date_time=explode(" ",$massive_row[0]);
$date=$date_time[0];
$date=explode("/",$date);
$date=array("20$date[2]","$date[0]","$date[1]");
$date=implode("-",$date);
$time=$date_time[1];
$ip=$massive_row[1];
$id=$massive_row[2];
$type=$massive_row[3];
$username=explode(".",basename($file_path));
$username=$username[0];
$byte_in_c=$massive_row[4];
$byte_out_c=$massive_row[5];
$byte_out_f_c=$massive_row[6];
$byte_in_f_c=$massive_row[7];
$sesion_time=$massive_row[8];
 

Profic

just Profic (PHP5 BetaTeam)
$file_s=file($file_path) or die("Невозможно открыть Log-файл wwwProxy");
Феерия. Интересно, что было бы с машиной, если бы я попытался так открыть 700 метровые логи сквида...

Ой, и правда две последующие строчки полностью дополняют феерическую картину... превращая ее в трагедию.
 

Фанат

oncle terrible
Команда форума
$file_s=file($file_path) or die("Невозможно открыть Log-файл wwwProxy");
$num_str = count($file_s);
fclose($file_s);
гениальная конструкция
ге-ни-аль-на-я!

-~{}~ 06.02.06 22:06:

Profic
заметь, он открывает его не для обработки!
обрабатывает он, читая по одной строчке!!!
 

SelenIT

IT-лунатик :)
Ripper

Какова конечная цель этой феерии? Распарсить последнюю строчку лога в переменные?
 

Ripper

Новичок
Что вы меня гнобите это первая моя прога на PhP и слету искупали в кале спс.
Если бы я видел бы свои ощибки я бы здесь не написал. =(
 

Фанат

oncle terrible
Команда форума
тебя ещё никто не гнобит.
в кале ты искупал себя сам
и лучше всего будет, если ты перестанешь изображать обиженого мальчика, а займёшься своими проблемами
 

SelenIT

IT-лунатик :)
Ripper
Меньше эмоций, больше дела. Предлагаю начать с формулировки задачи.
 

Ripper

Новичок
Задача есть лог файл Wingate
состоит он из кучи строк подобного вида
02/04/06 17:16:13 127.0.0.1 0000000004 Traffic 1492 546 458 1486 13s

надо содержимое добавит в БД
и далше обработать .
При каждом запусуке скрипта оно должен обновлять содержимое тоесть добавлять новые строки.

Могу исходникик выслать на почту.
 

Фанат

oncle terrible
Команда форума
эти логи растут бесконечно?
если нет, то по какому принципц обращаются?
 

Ripper

Новичок
впинципи скоревсего ростут до 4 гиг наверно но точно не знаю.
 

Фанат

oncle terrible
Команда форума
а потом что происходит?
кто занимается их обрезкой?
твой скрипт должен это делать?
 

Ripper

Новичок
Тоесть ситуация следуящая когда лог маленький Все нормально работает по мере рота объема комп очень сильно нагружается
и уже в раене 1 мб не вписывается в 30 сек обработки. Что делать =(

-~{}~ 06.02.06 21:36:

обрезкой занимается видемо сам вингейт просто логи еще до 4 гиг я не видел поэтому хз.
Просто тот файл постояно находится в открытом состоянии его пользует вингейт поэтому редактировать не получится.
Я планировал сделать следующим образом каждый раз запоминать последний номер строки файла а потом с него начинать считывать файл в буфер_файл и после его оттуда обрабатывать.
 

SelenIT

IT-лунатик :)
>При каждом запусуке скрипта оно должен обновлять содержимое тоесть добавлять новые строки.

Можно запомнить и записать куда-нибудь место в файле (номер байта), до которого данные были считаны при последнем вызове скрипта. И при новом вызове начинать чтение сразу с этого места с помощью [m]fseek[/m]. Естественно, открывать файл один раз, и только для считывания нужных данных.

А разобрать строку известного формата на переменные, имхо, проще всего с помощью [m]sscanf[/m].

P.S. Зачем перегонять логи в БД - по-прежнему непонятно, но пока ладно...
 

Фанат

oncle terrible
Команда форума
читай файл по одной строчке, и считай при этом.
 

Ripper

Новичок
вот я и читаю
/Создание файла содержащего число последней строчки или получени
$file_s=file($file_path) or die("Невозможно открыть Log-файл wwwProxy");
$num_str = count($file_s);
fclose($file_s);

-~{}~ 06.02.06 21:43:

БД надо для удобной обрабтки групировки подсчета итп..
там точнее я помещаю в масив.

-~{}~ 06.02.06 21:44:

Пробовал через fgets. исход тотже.
 

SelenIT

IT-лунатик :)
Ripper

Этой дикой конструкцией ты грузишь ВЕСЬ огромный файл в память, которой естественно не хватает. И кстати, fclose после [m]file[/m] не нужен.
 

Ripper

Новичок
а как подругому делать ?
Просьба ввиде кода спс зарание.
 

white phoenix

Новичок
О Господи! Какой ужас... меня буфер особенно порадовал.
PHP:
$file_path = 'C:\Program Files\WinGate\Audit\\'.$_POST['user'].'\\'.$_POST['user'].'.log';
$fp = fopen($file_path,'r') or die('Невозможно открыть Log-файл wwwProxy');
while (!feof($fp))
{
 $line = fgets($fp,4096);
 // обработка $line
}
fclose($fp);
Парсинг советую сделать регулярным выражением.
 
Сверху