PHP чтение файла с конца

Discussion in 'PHP' started by lukmus, 26 Jul 2010.

  1. lukmus

    lukmus Elder - Старейшина

    Joined:
    18 Nov 2009
    Messages:
    366
    Likes Received:
    115
    Reputations:
    23
    Я знаю тут есть такие кодеры для которых это раз плюнуть.
    Напишите, пожалуйста. Я бы сам написал, я знаю PHP, но в данном состоянии не могу, а очень нужно в цикле построчно считывать файл с конца.
    Спасибо.
     
  2. Dr1ver

    Dr1ver Elder - Старейшина

    Joined:
    20 Aug 2008
    Messages:
    83
    Likes Received:
    80
    Reputations:
    14
    PHP:
    <?
    $tmp=file('file.txt');
    $newtmp=array_reverse($tmp);

    foreach (
    $newtmp as $value)
    {
    echo 
    $value;
    }
    ?>
    Не совсем построчно с конца в цикле. Может так сойдёт...
     
  3. phpdreamer

    phpdreamer Member

    Joined:
    26 Jul 2009
    Messages:
    522
    Likes Received:
    86
    Reputations:
    19
    PHP:
    $tmp=file('file.txt'); 
    while(
    $a array_pop($tmp))
    {
    // действия с $a
    }
     
  4. WNZRS

    WNZRS Member

    Joined:
    3 Sep 2009
    Messages:
    294
    Likes Received:
    52
    Reputations:
    1
    Самое настоящее чтение с заду на перёд:
    PHP:
    <?php
        
    class FileReader
        
    {
            var 
    $fp;
            var 
    $t;
            
            function 
    FileReader($file)
            {
                
    $this->fp fopen($file'r');
                
    $this->= -2;
            }
            
            function 
    Close()
            {
                if(
    $this->fpfclose($this->fp);
                unset(
    $this);
            }
            
            function 
    Read()
            {
                if(
    $this->fp
                {
                    
    $data fgets($this->fp);
                    
    $this->ftell($this->fp);
                    return 
    $data;
                }
            }
            
            function 
    ReadC()
            {
                if(
    $this->fp
                {
                    
    $data fgetc($this->fp);
                    
    $this->ftell($this->fp);
                    return 
    $data;
                }
            }
            
            function 
    ReadBack()
            {
                if(
    $this->fp
                {
                    if(
    $this->== -2)
                    {
                        
    $stat fstat($this->fp);
                        
    $this->$stat['size'] - 1;
                        unset(
    $stat);
                    }
                    
                    
    $data '';
                    for(; 
    $this->>= 0$this->t--)
                    {
                        
    fseek($this->fp$this->t);
                        
    $c fgetc($this->fp);
                        
    $data $c.$data;
                        if(
    $c == "\n") { $this->t--; break; }
                    }
                    return 
    $data;
                }
            }
            
            function 
    ReadBackC()
            {
                if(
    $this->fp
                {
                    if(
    $this->== -2)
                    {
                        
    $stat fstat($this->fp);
                        
    $this->$stat['size'] - 1;
                        unset(
    $stat);
                    }
                    
                    
    fseek($this->fp$this->t);
                    
    $data fgetc($this->fp);
                    
                    return 
    $data;
                }
            }
            
            function 
    Feof()
            {
                return 
    feof($this->fp);
            }
            
            function 
    FeofBack()
            {
                return 
    $this->!= -1;
            }
        };
        
        
    $f = new FileReader('md5.php');
        while(
    $f->FeofBack())
        {
            echo 
    $f->ReadBack();
            echo 
    '<br>';
        }
        
    $f->Close();
    ?>
     
    1 person likes this.
  5. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    lukmus зачем? Какая стоит конечная цель?

    Ну и доп. вопросы - как часто изменяется файл, который так требуется читать? И как часто требуется так издеваться над файловой системой?
     
    _________________________
  6. roxblnfk

    roxblnfk Elder - Старейшина

    Joined:
    6 Feb 2010
    Messages:
    189
    Likes Received:
    42
    Reputations:
    19
    эт верно. лучше загружать пачку килобайт и инвертировать, чем читать по одному байту и смещать указатель на каждый символ.
     
  7. lukmus

    lukmus Elder - Старейшина

    Joined:
    18 Nov 2009
    Messages:
    366
    Likes Received:
    115
    Reputations:
    23
    файл изменяется часто (пару раз в минуту).
    загружать в массив файл и брать с конца - не вариант т.к. файл может быть слишком велик, а мне нужно только N конечных строк в обратном порядке
    попробую воспользоватся классом WNZRS. всем большое спасибо
     
  8. roxblnfk

    roxblnfk Elder - Старейшина

    Joined:
    6 Feb 2010
    Messages:
    189
    Likes Received:
    42
    Reputations:
    19
    дак бери не весь файл а к примеру 4 кбайта, если в них не хватает строк, бери ещё столько же, лишнее обрезать не долго
     
  9. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    lukmus вся проблема, что вы ищете решение частной задачи, а не общей. Если вам, например, требуется читать только новые данные из файла, то стоит сохранять текущий размер файла и потом с помощью fseek переходить на эту позицию и от нее читать и инвертировать файл. Если же это некий лог, который только дописывается, и требуется часто читать строго N последних строк, то посмотрите в сторону использования СУБД.

    Ну а читать побайтово - это насилие над ФС, и лучше читать все же по размеру кластера, а потом php.net/explode
     
    _________________________
  10. lukmus

    lukmus Elder - Старейшина

    Joined:
    18 Nov 2009
    Messages:
    366
    Likes Received:
    115
    Reputations:
    23
    я понил, я вообще дурак, я буду читать файл обычным образом - я буду записывать задом наперед, это гораздо легче.
    Gifts, я бы тоже хотел использовать СУБД, но к сожалению сейчас это не возможно в данной ситуации