Здравствуйте! Подскажите пожалуйста как мне получить последние 30 строк из текстового файла в обратном порядке не загружая весь файл в масив (т.к. бывает очень большой иногда). Пробовал записывать данные сразу в обратном порядке: PHP: function logs($msg,$id){ $file_gb = "log/$id.txt"; $file_tmp = "log/$id_tmp.txt"; if (file_exists ($file_tmp)) die ("Временный файл существует!"); if (copy ($file_gb, $file_tmp)) {if ($w=fopen($file_gb, "w")) {flock($w,2); fwrite ($w, $msg."\n"); if (!$r=fopen($file_tmp, "r")) die ("Невозможно открыть файл"); flock ($r,1); while ($msg=fgets($r, 10240)){fputs ($w, $msg); }flock ($r,3);fclose ($r);flock ($w,3);fclose ($w);unlink ($file_tmp);}}} не удобно читать потом, и с каждой записью увеличивается время обработки в 2 раза
Romzess Никак =) Его все равно надо открывать и получать. Ввиде строки или ввиде массива - как тебе удобнее. Хотя если бы нужно было первые строки получать, и, тем более, если бы была известна их длина, то с помощью fread можно прочитать первые n-ное количество байт.
PHP: <? $filename = 'waka.log'; $buffer = 8192; $newLineSeparator = "\n"; $limit = 30; $result = array(); $str = ''; $needLines = $limit; $fp = fopen($filename, 'rb'); for ($end = filesize($filename); 0 < $end and $needLines; $end -= $buffer) { fseek($fp, max(0, $end-$buffer), SEEK_SET); $str = fread($fp, $buffer).$str; while(false !== ($pos = strrpos($str, $newLineSeparator)) and $needLines) { if ($pos+1 < $buffer) { $result[] = substr($str, $pos+1); $needLines--; } $str = substr($str, 0, $pos); } } print_r($result);