Помогите пожалуйста разобраться с примером с php.net

Camillo

Новичок
Помогите пожалуйста разобраться с примером с php.net

Привет.

В комментариях к ф-ии fgets нашел комментарий. В этом кусочке кода показывают как можно обрабатывать файлы большого объёма, читая их "порциями".

Попробовал применить этот php код к простому log файлу размером 140Мб. Поставил размер "порции" равным 1Мб;
и сделал так, чтобы во время считывания файла производился подсчет символов chr(10).

После запуска кода - обнаружил, что кол-во символов chr(10), подсчитанное скрпитом не соответствует кол-ву строк в log файле. Цифра очень похожая, но всё же не точная.

Умные люди, подскажите пожалуйста - в чем может быть дело?

Вот пример самого кода:

PHP:
<?
$file = "file.log";
$fp = fopen($file, 'r');
$read = 1048576;
$part = 0;
$k = 0;

while(!feof($fp)) {
if(!is_valid($fp, "stream")) die();
   $rbuf = fread($fp, $read);
   for($i=$read; $i > 0 || $n == chr(10); $i--) {
       $n=substr($rbuf, $i, 1);
       if($n == chr(10)) {
           break;
       }
       elseif(feof($fp)) {
           $i = $read;
           $buf = substr($rbuf, 0, $i+1);
           $k += substr_count($buf, chr(10));
           break;
       }
   }
   $buf = substr($rbuf, 0, $i+1);
   $k += substr_count($buf, chr(10));
   $part = ftell($fp)-($read-($i+1));
   if (filesize($file) < $part) die();
   fseek($fp, $part);
}
echo($k);
fclose($fp);

?>
Я очень извиняюсь, что нарушил правила форума и отразил такой большой кусок кода. Надеюсь на ваше понимание.

Спасибо.
 

Popoff

popoff.donetsk.ua
Camillo
уверен, твоя проблема не в fgets, не в подсчете символов и даже не в поэтапном считывании.

попробуй что-нибудь типа substr_count.

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

svetasmirnova

маленький монстрик
Да, кстати, строки заканчиваются не только chr(10), но и chr(13) и chr(10)chr(13). Так что пиши скрипты сам.
 

Camillo

Новичок
Автор оригинала: svetasmirnova
Да, кстати, строки заканчиваются не только chr(10), но и chr(13) и chr(10)chr(13). Так что пиши скрипты сам.
Ага, придется самому писать :p.

В моём случае это лог файл, записанный апачем и chr(13) там отсутствует.

Popoff, ну так я и использую substr_count для подсчета кол-ва вхождений chr(10) в строку $buf, которая является очередной "порцией", считанной из файла.

Ладно, будем черепить. :D
 

Popoff

popoff.donetsk.ua
жуть %) это ж надо было так намудрить %)

-~{}~ 25.01.06 12:44:

если $buf - это очередная порция, считанная из файла, то что такое $rbuf? :)
 

Camillo

Новичок
Автор оригинала: Popoff
жуть %) это ж надо было так намудрить %)

-~{}~ 25.01.06 12:44:

если $buf - это очередная порция, считанная из файла, то что такое $rbuf? :)
$rbuf это то, что нужно считать т.е. в нашем примере это "кусок" файла между указателем в файле и указатель в файле + $read (в нашем случае это 1048576 байт)

$buf это "кусок" файла длины $read + дочитанная до символа chr(10) строка. Сделано для того, чтобы не получалось так, что половина строки попала в одну "порцию", а другая половина в другую "порцию".

:cool:
 
Сверху