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

Ripper

Новичок
У меня ранше было вот так
PHP:
$file_path="C:\Program Files\WinGate\Audit\\$_POST[user]\\$_POST[user].log";
$file_s=fopen($file_path,"r") or die("Невозможно открыть Log-файл wwwProxy");
	while(!feof($file_s))
	{
	$file = $file.fgets($file_s, 4096);
	}
fclose($file_s);
$buffer_path="C:\Program Files\WinGate\Audit\\$_POST[user]\buffer.log";
	if(!file_exists($buffer_path))
	{
	$create=fopen($buffer_path,"w") or die("Не могу создать файл буфера");
	fclose($create);
	}
$buffer_s=fopen($buffer_path,"r") or die("Не могу открыть файл буфера");
	while(!feof($buffer_s))
	{
	$buffer = $buffer.fgets($buffer_s,4096);
	}
fclose($buffer_s);
$add=str_replace($buffer,NULL,$file);
echo '$massive_str=explode("\n",$add)';
Плужыт точно также .
 

SiMM

Новичок
> while(!feof($file_s)) $file = $file.fgets($file_s, 4096);
Зачем тебе загонять весь файл в память?
 

Фанат

oncle terrible
Команда форума
слушай, а откуда этот код взялся?
кто его писал?
и какой логикой руководствовался?
 

Ripper

Новичок
во что мне надо преобразовать мой код ?

-~{}~ 06.02.06 23:54:

насчет логики вроде с ней тоже все впорядке там типо считало новый файл считало старый разницу записало в базу
писал сново я =(
 

SelenIT

IT-лунатик :)
Ripper
...типо считало новый файл считало старый разницу записало...
Типо это единственный способ узнать, что изменилось (читай-добавилось) в файле между вызовами скрипта? Не верю!

Эх... чисто как иллюстрация идеи:
PHP:
# "вспоминаем" позицию последнего чтения, если она уже была записана,
# если нет - будем читать файл с начала:
$lastpos = (file_exists('lastpos.txt')) ? file_get_contents('lastpos.txt') : 0;
# открываем файл:
$fp = fopen('access.log', 'rb');
# переходим к заданной позиции:
fseek($fp, $lastpos);
# построчно читаем до конца:
while(!feof($fp)) {
   $line = fgets($fp);
   # запоминаем позицию конца очередной строки:
   $lastpos += strlen($line);
   # как пример обработки выделим из строки ip-адрес и выведем его:
   $parts = explode(' ', $line);
   echo 'IP: ' . $parts[2] . "<br>\n";
}
# закрываем файл.
fclose($fp);

# записываем позицию последнего чтения во вспомогательный файл
$fp1 = fopen('lastpos.txt', 'wb');
fwrite($fp1, $lastpos);
fclose($fp1);
 

Ripper

Новичок
Попробую переделать ...

-~{}~ 07.02.06 15:36:

с этой конструкцией я незнаком обясни что это значит
$lastpos = (file_exists('lastpos.txt')) ? file_get_contents('lastpos.txt') : 0; ?
 

Фанат

oncle terrible
Команда форума
это то же самое, что и
if (file_exists('lastpos.txt')) {
$lastpos=file_get_contents('lastpos.txt');
} else {
$lastpos=0;
}
 

Ripper

Новичок
Переделал в такого рода но чтото оно вобще не фурычит либо я чтото не так написал либо товариш в примере

$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($line_path))
{
$create=fopen($line_path,"w") or die("Не могу создать файл Строки");
fputs ($create, "0");
fclose($create);
}
else
{
$lastpos=file_get_contents($line_path); //получение номера строчки
}
//Создание файла содержащего число последней строчки или получени
$file_s=fopen($file_path,'rb') or die("Невозможно открыть Log-файл wwwProxy");
fseek($file_s,$lastpos);
while(!fof($file_s))
{
$line=fgets($file_s);
$lastpos+=strlen($line);
$massive_str=explode("\n",$line);
$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];
$query_put="INSERT INTO traffic VALUES (
NULL,
'$date',
'$time',
'$ip',
'$id',
'$type',
'$username',
'$byte_in_c',
'$byte_out_c',
'$byte_in_f_c',
'$byte_out_f_c',
'$sesion_time'
)";
$result_put=mysql_query($query_put);
if(!$result_put) echo "<p><b> Error".mysql_error()."</b></p>";
}
fclose($file_s);
$file_lastpos = fopen($line_path, 'wb');
fwrite($file_lastpos, $lastpos);
fclose($file_lastpos);
}

-~{}~ 07.02.06 16:17:

fseek вроде надов теле цыкла разместить хотя оно тоже не пашыт
 

Ripper

Новичок
В плпне ошибок не выдает некаких просто в мускул не добавляет не единой строчки и в файле содержашем конечный адрес тоже нечего не меняется. Щас читаю ФаКю мож чтото полезное найду.

-~{}~ 07.02.06 16:29:

стоять я нашел что там раком написано fof вместо feof

-~{}~ 07.02.06 16:38:

Исправил работае щас проверю быстро действие
 

Nogrogomed

Новичок
white phoenix
$line = fgets($fp,4096); - это ж не по строкам считывание.
Можно же через scanf считать одну строчку...
1. Запоминаем позицию последнего считывания
2. Открываем файл
3. Ставим fseek на нужную позицию
4. Через scanf считываем строчку и обрабатываем
5. Повторяем шаг 4 до конца файла
6. Запоминаем номер байта на котором остановились
7. Закрываем файл
 

Ripper

Новичок
Быстродействие опятже таки плачевное =(( 500 кб 25 сек
что еще можно оптимизировать.
Неможет ли быть токим местом MySQL ?

-~{}~ 07.02.06 18:29:

Переделал в $line = fgets($fp,4096);
все теже 25 секунд на 500 Кб файла что делать =(
 

Ripper

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

Ripper

Новичок
уже включил обратно оно не напрягало ибо в базе было пусто после того как добавил оно опят начало плужыть.
 

Ripper

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

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
/*/Цыкл обработки годов
for($y=$yrs;$y<=$yre; $y++)
{
if($y == $yre)
{
$m_min=1;
$d_min=1;
$m_max=translate($mne);
$d_max=$daye;
$mn_t=0;
}
if($y == $yrs)
{
$m_min=translate($mns);
$d_min=$days;
$m_max=12;
$d_max=31;;
$mn_t=translate($mns)-1;
}
if($y <> $yrs && $y <> $yre)
{
$m_min=1;
$d_min=1;
$m_max=12;
$d_max=31;
$mn_t=0;
}
if($yrs== $yre)
{
$m_min=translate($mns);
$d_min=$days;
$m_max=translate($mne);
$d_max=$daye;
$mn_t=translate($mns)-1;
}
if($mns >= $mne && $yrs == $yre || $yre <> $yrs)
{
//Цикл обработки месяцев
$d=$d_min;
for($m=$m_min; $m <= $m_max; $m++ )
{
//Цикл обработки дней
if($mn_t == 12) $mn_t =0;
$mn_t++;
if($m == translate($mne)) $d_max=$daye;
else $d_max=31;
for($d; $d<=$d_max; $d++)
{
if($d<10)
{
if($mn_t<10) $array_date_print=array($y,"0$mn_t","0$d");
else $array_date_print=array($y,$mn_t,"0$d");
}
else
{
if($mn_t<10) $array_date_print=array($y,"0$mn_t",$d);
else $array_date_print=array($y,$mn_t,$d);
}
$date_finaly=implode("-",$array_date_print);
if($d == $days)
{
$query_select_user="SELECT bytes_in_c, bytes_out_c FROM traffic where date_www='$date_finaly' && username='$_POST[user]' && time_www>='$tmhs:$tmms:00'";
}
if($d==$daye)
{
$query_select_user="SELECT bytes_in_c, bytes_out_c FROM traffic where date_www='$date_finaly' && username='$_POST[user]' && time_www<='$tmhe:$tmme:00'";
}
if($d == $days && $d == $daye)
{
$query_select_user="SELECT bytes_in_c, bytes_out_c FROM traffic where date_www='$date_finaly' && username='$_POST[user]'&& time_www>='$tmhs:$tmms:00' && time_www<='$tmhe:$tmme:00'";
}
if($d <> $days && $d <> $daye)
{
$query_select_user="SELECT bytes_in_c, bytes_out_c FROM traffic where date_www='$date_finaly' && username='$_POST[user]'";
}
$result_select_user=mysql_query($query_select_user);
if(!$result_select_user) echo "<p><b> Error".mysql_error()."</b></p>";
while($traffic=mysql_fetch_array($result_select_user))
{
$sum_in=$sum_in+$traffic[bytes_in_c];
$sum_out=$sum_out+$traffic[bytes_out_c];
}
$sum_in=$sum_in/1024/1024;
$sum_out=$sum_out/1024/1024;
$overall_in=$overall_in+$sum_in;
$overall_out=$overall_out+$sum_out;
echo "<a href='time_list.php?date=$date_finaly&USER=$_POST[user]&TIMES=$tmhs:$tmms:00&TIMEE=$tmhe:$tmme:00'>$date_finaly </a>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Входящий трафик: ";
printf ("%.2f Мб&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",$sum_in);
echo "Исходящий трафик: ";
printf ("%.2f Мб<br>",$sum_out);
if($d == 31)
{
$d=1;
break;
}
}

}
}
else echo "<div align=center><h3>Неправильно указан диапазон дат (Месяцы)<br><a href=# onClick ='history.back()'>Назад</a><h3></div>";
}
$sum_overall=$overall_in+$overall_out;
echo "<br><br>Общий трафик за период Входящий:";
printf ("&nbsp;&nbsp;&nbsp;&nbsp;%.2f Мб&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",$overall_in);
echo "<br>Общий трафик за период Исходящий:";
printf ("&nbsp;&nbsp;%.2f Мб&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",$overall_out);
echo "<br>Суммарный трафик за период :";
printf ("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%.2f Мб&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;",$sum_overall);
*/
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
 

Фанат

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