За последние 24 часа нас посетили 56898 программистов и 1792 робота. Сейчас ищет 871 программист ...

Текстовый файл

Тема в разделе "PHP для новичков", создана пользователем Romzess, 13 июн 2008.

  1. Romzess

    Romzess Активный пользователь

    С нами с:
    11 июн 2008
    Сообщения:
    30
    Симпатии:
    0
    Здравствуйте!
    Подскажите пожалуйста как мне получить последние 30 строк из текстового файла в обратном порядке не загружая весь файл в масив (т.к. бывает очень большой иногда).
    Пробовал записывать данные сразу в обратном порядке:
    PHP:
    1. function logs($msg,$id){
    2. $file_gb = "log/$id.txt";  
    3. $file_tmp = "log/$id_tmp.txt";
    4. if (file_exists ($file_tmp)) die ("Временный файл существует!");
    5. if (copy ($file_gb, $file_tmp))
    6. {if ($w=fopen($file_gb, "w"))
    7. {flock($w,2);
    8. fwrite ($w, $msg."\n");
    9. if (!$r=fopen($file_tmp, "r")) die ("Невозможно открыть файл");
    10. flock ($r,1);
    11. while ($msg=fgets($r, 10240)){fputs ($w, $msg);  
    12. }flock ($r,3);fclose ($r);flock ($w,3);fclose ($w);unlink ($file_tmp);}}}
    не удобно читать потом, и с каждой записью увеличивается время обработки в 2 раза
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Romzess
    Никак =) Его все равно надо открывать и получать. Ввиде строки или ввиде массива - как тебе удобнее.
    Хотя если бы нужно было первые строки получать, и, тем более, если бы была известна их длина, то с помощью fread можно прочитать первые n-ное количество байт.
     
  3. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    PHP:
    1. <?
    2. $filename = 'waka.log';
    3. $buffer = 8192;
    4. $newLineSeparator = "\n";
    5. $limit = 30;
    6.  
    7. $result = array();
    8.  
    9. $str = '';
    10. $needLines = $limit;
    11.  
    12. $fp = fopen($filename, 'rb');
    13. for ($end = filesize($filename); 0 < $end and $needLines; $end -= $buffer) {
    14.     fseek($fp, max(0, $end-$buffer), SEEK_SET);
    15.     $str = fread($fp, $buffer).$str;
    16.     while(false !== ($pos = strrpos($str, $newLineSeparator)) and $needLines) {
    17.         if ($pos+1 < $buffer) {
    18.             $result[] = substr($str, $pos+1);
    19.             $needLines--;
    20.         }
    21.         $str = substr($str, 0, $pos);
    22.     }
    23. }
    24.  
    25. print_r($result);
     
  4. Romzess

    Romzess Активный пользователь

    С нами с:
    11 июн 2008
    Сообщения:
    30
    Симпатии:
    0
    6 балов